构造函数
- 定义;
1 ;特殊的成元函数-- 控制对象·初始化
构造函数的名称与类名相同,并且不返回任何类型,也不会返回 void
2;可以有多个构造函数(函数重载)== 参数列表必须不同
类的构造函数初始化列表
形式;构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。示例代码;
class A{
public:
int a;
double b;
A() : a(1),b(1.0) {}
A(){
a=2;
b=2.0;
}
};
数据成员按类型分类并分情况说明:
- 1.内置数据类型,复合类型(指针,引用)
在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的 - 2.用户定义类型(类类型)
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)
初始化列表的成员初始化顺序
- C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序
class B{
B(int a,int b);
int _a;
int _b;
};
B::B(int x,int y):_a(x),_b(y)
{
}
类 -> 对象控制
-
-
拷贝
- 拷贝构造函数
1: 拷贝构造函数
定义 第一个参数是自身的引用类型(必须是引用类型),且任何额外参数都有默认值
合成拷贝构造函数
编译器合成 (默认一定会生成)
初始化方式
直接初始化 ;编译器选择普通函数与所给参数最匹配的构造函数
拷贝初始化; 编译器将右侧对象拷贝到正在创建的对象中\* 拷贝初始化在下列情况下依然发生 > 将对象作为一个实参传递给一个非引用类型的对象 >从 一个返回类型为非引用类型的函数返回一个对象 return !&; > 用花括号初始化一个数组元素或一个聚合类成员
示例
class Foo{
public:
Foo();
Foo(const Foo &){}; //必须是引用类型
// …
};
2.: 拷贝赋值函数
实例
int main()
{
String s1();
String s2("hello");
String s3(s1); //拷贝赋值
cout<<s3<<endl;
s3=s2; // 拷贝构造
cout<<s3<<endl;
}
- 拷贝构造和拷贝赋值是一种忠实的拷贝,内存一个字节一个字节的拷贝