环境:ide:Mac+clion
视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
构造函数和析构函数,编译器自动调用。
构造函数,不需要返回值,无需void和类名相同,可以写参数。可以发生重载; 编译器自动调用,只调用一次。
析构函数,名称与类名相同,析构函数不可以有参数。不能发生重载。在函数名前面加~.对象销毁前编译器自动调用。只调用一次。
//构造函数.析构函数,拷贝构造函数
class Person {
public:
Person() {
cout << "默认构造函数执行" << endl;
}
Person(int a) {
cout << "有参构造函数执行" << endl;
}
~Person() {
cout << "析构函数执行" << endl;
}
//拷贝构造函数,必须是const 以及引用的方式传递。
Person(const Person &p) {
//将传入的人的属性,copy到当前对象的身上。
cout << "拷贝构造函数!" << endl;
}
};
int main() {
/**
* 括号法初始化对象。
*/
//Person p();//这个不是调用默认构造函数,作为函数声明来使用。不能用括号法来创建对象。
Person person;//执行默认构造函数。然后执行析构函数。
Person person1(1);//执行有参构造函数,析构函数。
Person p2(person1);//copy 构造函数
/**
* 显示初始化方法。
*/
Person p1 =Person();
Person p3 = Person(10);//有参构造函数。右边的叫做匿名对象,当前行执行结束后,系统会立即回收掉对象。
Person p4 = Person(p3);//copy 构造函数
/**
* 隐示转换
*/
Person p5 = 10; //又参构造
Person p6 = p4;//这是拷贝构造函数。
return 0;
};
1.值传递其实就是copy 了一个副本,所以必然会调用copy 构造函数。
2.利用一个已有的数据,来初始化新的对象。
3.值方式传递局部对象。
//这里是值传递。就会执行copy 构造函数
void doWork(Person1 p) {
}
Person1 person1;
doWork(person1);//这里会产生一个copy 副本。
Person1 person2(10);
Person1 person3(person2); //这里直接用person2 来给person3进行copy 赋值。
只要写一个类,那么就会默认添加:如果写了默认构造函数,就不会调用默认的构造函数。析构函数和默认copy 构造函数也一样。
1.默认构造函数(空实现)
2.默认析构函数 (空实现)
3.默认copy 函数。对属性进行一个赋值。值copy。
如果提供了自定义的copy 构造函数,那么编译器就不会提供默认构造函数。
因为提供了copy 构造函数,所以会忽略掉默认构造函数。
class Person{
public:
Person(const Person &p){
this->m_Age = p.m_Age;
cout << "copy 构造函数执行!"<<endl;
}
private:
int m_Age;
};
void test() {
Person p;//这里编译不通过。因为Person 类只提供了copy 构造函数,就会忽略掉默认构造函数。
}
网友评论