C++是一种编译性的语言,设计好一个C++源程序后,需要经过编译、连接,生成可执行的程序文件,然后执行并调试程序。当C++源程序设计好后,程序员利用一个编辑系统将源程序输入计算机中的某一个文件中,并进行必要的修改。C++源程序文件的扩展名为.cpp。在VC++6.0环境中,编译和连接两个步骤是由系统本身一次完成的。完整的C++程序的开发步骤如图1.2所示。图1.2C++程序开发步骤......
2025-09-30
当定义类对象时,构造函数会自动执行。因为一个类可能会有包括默认构造函数在内的不止一种构造函数,下面讨论如何调用特定的构造函数。
1.调用默认构造函数
如果类的定义中没有给出构造函数,则C++语言编译器自动给出一个默认的构造函数,而且默认的构造函数只能有一个,形式如下:
类名∷默认构造函数名()
{
}
若没有定义任何形式的构造函数,系统会自动生成默认的构造函数。若已经定义了构造函数,则系统不会自动生成默认的构造函数,一旦需要,则要求显式地定义这种形式的构造函数。
假设一个类包含有默认构造函数,调用默认构造函数的语法如下:
类名类对象名;
例如,语句:
MyClass2 sa;
将sa定义为MyClass2类型的对象。在这种情况下,会执行默认的构造函数,从而将sa的数据成员初始化为0。因此,在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该对象。
注意:如果定义了一个对象并且希望默认构造函数被执行,在定义语句中,“类对象名”后面是不需要空括号的。如果包含了空括号,编译器将会产生一个语法错误信息。例如,以下语句是非法的:
MyClass2 mysa();
2.调用带参数的构造函数
假设一个类中包含有带参数的构造函数,调用这种带参数的构造函数的语法如下:类名类对象名(参数表)
其中,“参数表”中的参数可以是变量,也可以是表达式。
注意:参数的个数、类型和顺序应该与所定义的构造函数相匹配。如果参数的类型和顺序不与任何构造函数相匹配,则C++将使用类型转换并寻找最佳匹配。例如,一个整型数可能会转换成小数部分为0的浮点数。任何不确定因素都会导致编译错误。
例如,语句:
MyClass2 sa1(120,210);
该语句定义了一个MyClass2类型的对象sa1。这里传递两个int型的值,并与MyClass2类的一个带参数的构造函数相匹配。因此,会执行MyClass2类中带参数的构造函数,从而将数据成员x和y分别赋值为120和210。
3.调用内置数据类型的构造函数
实际上,C++中内置的数据类型都可以看成是类,定义变量时除了可以使用“=”运算符赋初值外,还可以像定义类对象一样调用其构造函数给变量赋初值,例如,以下语句都是正确的:
4.用new动态创建对象
可以用new运算符来动态地建立对象。用new运算符建立对象时,同样也要自动调用构造函数,以便完成对象数据成员的初始化。(https://www.chuimin.cn)
【例2.5】分析以下程序的执行结果。
解:上述程序中,先声明了一个类Point1,在该类中有一个构造函数。程序的执行结果如下:
First point=>(12,6)
Second point=>(5,12)
从执行结果看到,当执行语句
Point1 a(12,6),p=new Point1(5,12);
时,不仅定义了Point1类的对象a和一个匿名对象指针p,还自动调用类的构造函数。也就是说,在定义类的对象时就自动调用构造函数进行对象的初始化。这是因为,编译器已悄悄地在a的定义点处插入了一个Point1∷Point1(12,6)的调用。
注意:在创建匿名对象时要调用类的构造函数。
【例2.6】分析以下程序的执行结果。
解:上述程序中,通过对象指针来调用对象的成员函数。对象指针p指向对象s,p->disp()等价于s.disp()。程序执行结果如下:
x=12,y=3
注意:与定义一般对象不同的是,在定义对象指针而不使用new创建新的匿名对象或者定义对象指针指向一个已创建的对象时,都不会调用类的构造函数。
5.用构造函数初始化对象的过程
用构造函数初始化对象的过程,实际上就是对构造函数的调用过程。一般情况下按如下步骤进行。
(1)程序执行到定义对象语句时,系统为对象分配内存空间;
(2)系统自动调用构造函数,将实参传送给形参,执行构造函数体时,将形参值赋给对象的数据成员。完成数据成员的初始化工作。
【例2.7】分析以下程序的执行结果。
解:本程序执行结果如下:
调用带参构造函数
矩形s1的面积=153
调用无参构造函数
矩形s2的面积=0
由程序执行的结果可以看到,在执行Rectangle s1(1,3,8,12)语句定义对象s1时,系统先为对象s1分配内存空间,然后自动调用带参构造函数s1.Rectangle(1,3,8,12),将实参传给形参,在构造函数体内用赋值语句完成对象s1的初始化工作,再调用成员函数s1.Area()求对象s1面积;在执行Rectangle s2语句产生对象s2时,系统自动调用无参构造函数s2.Rectangle(),将私有数据成员初始化为0,再调用成员函数s2.Area()求对象s2面积。
相关文章
C++是一种编译性的语言,设计好一个C++源程序后,需要经过编译、连接,生成可执行的程序文件,然后执行并调试程序。当C++源程序设计好后,程序员利用一个编辑系统将源程序输入计算机中的某一个文件中,并进行必要的修改。C++源程序文件的扩展名为.cpp。在VC++6.0环境中,编译和连接两个步骤是由系统本身一次完成的。完整的C++程序的开发步骤如图1.2所示。图1.2C++程序开发步骤......
2025-09-30
C++中,语句默认都是顺序执行,如果碰到选择或循环语句,顺序执行的规则就要改变。C++中的选择控制语句有if语句、if...else语句、if...else if语句和sw itch语句。对于简单的if...else语句,可以使用条件运算符来代替。“语句1”、“语句2”、…使用sw itch语句应注意下列问题:◇整型表达式包括字符型或枚举型表达式。......
2025-09-30
指针初始化有几种方式:指针对象可以被一个具有相同类型的对象初始化。下面的例子将整型指针ip赋给另一整型指针ip2:int*ip2=ip;此时,这两个指针指向同一内存空间,可用图1.8表示。图1.8指针与指针所指对象如果程序员想强制赋给指针另一种类型变量的地址,则必须显式进行类型转换。如要将一个整型指针的值赋给浮点数指针,可以采用以下语句:float*fp=ip;通过直接分配内存地址得到初值。......
2025-09-30
在C++中,数组和指针密切相关,几乎可以互相使用。数组名字可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以用于完成任何涉及数组下标的操作。实际上,数组下标表示法在编译期间将转换为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。如果再定义一个字符指针:char*pname=name;则name[i]、*和*具有相同的值,都是数组第i+1个元素的值。分析以下程序的执行结果。......
2025-09-30
C++的标准输入/输出流库用于数据的输入/输出,用于输入/输出的流库包含在头文件iostream.h中。表1.4常用的输入/输出流操纵符显示常数使用cout可以显示字符串和数字,并可显示多个值。因此,用户输入数据时要避免输入的数据超出指定变量的值域。程序的执行结果如下:注意:使用cin输入一个字符串时,其中不能含有空格,否则,cin认为输入结束。......
2025-09-30
类是一种用户自定义的数据类型,定义一个类,就是描述类名及其成员。“类名”是一个标识符,用于唯一标识一个类。分析以下声明MyClass类的组成。该类的描述如图2.1所示,其中大圆圈中列出的函数名均为公有函数名,小圆圈中列出的是所有数据成员。图2.1MyClass类描述注意:因为类是一种数据类型,在声明一个类时系统并不会为其分配内存空间,所以在定义类中的数据成员时,不能对其进行初始化。......
2025-09-30
C++支持三种格式的循环控制语句:while、do和for语句。图1.3while语句的执行过程编写一个程序,将用户输入的整数反向显示出来。解:程序如下:3.for语句for语句通常用于预先知道循环次数的情况,其一般形式为:for语句;其中,“初始化语句”可以是一个定义语句或表达式语句,一般用于对一组变量进行初始化或赋值。“表达式2”在每次循环执行完成后执行,一般用于改变控制循环的变量。......
2025-09-30
计算机语言的种类非常多,总的来说可分成机器语言、汇编语言、高级语言三大类。计算机硬件系统可以识别的语言只有机器语言,它是由0和1构成的二进制代码。目前,通用的编程语言主要有两种形式:汇编语言和高级语言。但汇编源程序一般比较冗长、复杂、容易出错,使用汇编语言编程需要有更多的计算机专业知识。......
2025-09-30
相关推荐