c++定义类的时候,只提供拷贝构造函数而不提供默认(无参)构造函数和有参构造函数会怎样?

4.2.4 构造函数调用规则

默认情况下,c++编译器至少给一个类添加三个函数:

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数(对属性进行值拷贝)

构造函数调用规则:

  1. 如果用户定义有参构造函数,编译器不会提供默认(无参)构造,但是会提供默认拷贝构造函数
  2. 如果用户定义拷贝构造函数,编译器则不会提供其他构造函数
class Person {
public:
	//无参(默认)构造函数
	Person() {
		cout << "无参构造函数!" << endl;
	}
	//有参构造函数
	Person(int a) {
		age = a;
		cout << "有参构造函数!" << endl;
	}
	//拷贝构造函数
	Person(const Person& p) {
		age = p.age;
		cout << "拷贝构造函数!" << endl;
	}
	//析构函数
	~Person() {
		cout << "析构函数!" << endl;
	}
public:
	int age;
};

void test01()
{
	Person p1(18);
	//如果不写拷贝构造,编译器会自动添加拷贝构造,并且做浅拷贝操作
	Person p2(p1);

	cout << "p2的年龄为: " << p2.age << endl;
}

void test02()
{
	//如果用户提供有参构造,编译器不会提供默认构造,会提供拷贝构造
	Person p1; //此时如果用户自己没有提供默认构造,会出错
	Person p2(10); //用户提供的有参
	Person p3(p2); //此时如果用户没有提供拷贝构造,编译器会提供

	//如果用户提供拷贝构造,编译器不会提供其他构造函数
	Person p4; //此时如果用户自己没有提供默认构造,会出错
	Person p5(10); //此时如果用户自己没有提供有参,会出错
	Person p6(p5); //用户自己提供拷贝构造
}

int main() {

	test01();

	system("pause");

	return 0;
}

在上面的代码中我们不禁思考,如果对于一个类只提供拷贝构造函数而不主动提供默认构造函数和有参构造函数,那么这个类将会缺乏这两种构造函数。此时我们没有办法创建一个对象来对于其他的对象初始化,也就是说这个类处于无效状态。为此,我们进行了如下代码的检验:

class Person {
public:
	////无参(默认)构造函数
	//Person() {
	//	cout << "无参构造函数!" << endl;
	//}
	////有参构造函数
	//Person(int a) {
	//	age = a;
	//	cout << "有参构造函数!" << endl;
	//}

	//拷贝构造函数
	Person(const Person& p) {
		age = p.age;
		cout << "拷贝构造函数!" << endl;
	}

	//析构函数
	~Person() {
		cout << "析构函数!" << endl;
	}
public:
	int age;
};

//void test01()
//{
//	Person p1(18);
//	//如果不写拷贝构造,编译器会自动添加拷贝构造,并且做浅拷贝操作
//	Person p2(p1);
//
//	cout << "p2的年龄为: " << p2.age << endl;
//}
//
//void test02()
//{
//	//如果用户提供有参构造,编译器不会提供默认构造,会提供拷贝构造
//	Person p1; //此时如果用户自己没有提供默认构造,会出错
//	Person p2(10); //用户提供的有参
//	Person p3(p2); //此时如果用户没有提供拷贝构造,编译器会提供
//
//	//如果用户提供拷贝构造,编译器不会提供其他构造函数
//	Person p4; //此时如果用户自己没有提供默认构造,会出错
//	Person p5(10); //此时如果用户自己没有提供有参,会出错
//	Person p6(p5); //用户自己提供拷贝构造
//}

void test03()
{
	//Person p7((Person)10);
	//类型强转依旧会报错
}

int main() {

	//test01();
	//test02();
	test03();

	system("pause");

	return 0;
}

所以说,如果只提供拷贝构造函数的话,这个类相当于直接废掉了
无法进行初始化,应该也不可能创建对象
但是不使用这个class的时候并不会报错

posted @   yujustxiaobai  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示