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

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

时间:2024-02-13 19:33:21浏览次数:32  
标签:无参 提供 默认 Person 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的时候并不会报错

标签:无参,提供,默认,Person,c++,拷贝,构造函数
From: https://www.cnblogs.com/yujustxiaobai/p/18014770

相关文章

  • C++——异常处理模块笔记
    异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况。异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误、访问无效内存等。C++提供了一套异常处理机制,使得程序可以优雅地处理这些异常,提高程序的可靠性和健壮性。异常是一种程序......
  • 【C++】两两交换链表中的节点
    #include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};ListNode*swapPairs1(ListNode*head){ListNode*dummyHead=newListNode(0);dummyHead......
  • 【C++】给定两个增序的链表,试将其合并成一个增序的链表。
    给定两个增序的链表,试将其合并成一个增序的链表。#include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};voidprintList(ListNode*head){while(head){std:......
  • 【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
    题目:假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:0≤n,m≤1000000,链表任意值0≤val≤9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为6->3,最后生成新的结果链表......
  • C++11 用户定义字面量
    C++11用户定义字面量C++11引入了一项功能,称为用户自定义字面量(user-definedliterals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。内置字面量C++自带4种字面量:整形123浮点型12.3字符'1'字符串"123"字面量又可添加后缀来表明具体类型,建议大写:无符......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • C++Primer
    前言固然,轻薄短小的书籍乍见之下让所有读者心情轻松,但如果舍弃太多应该深入的地方不谈,也难免令人行止失据,进退两难。……作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度。起步固然可从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只......
  • C++OpenCV 按之前图片名称保存图片
    C++OpenCV按之前图片名称保存图片://图片地址cv::Stringpattern="./path/*.jpeg";//可以使用cv::glob函数来获取匹配模式的文件路径列表std::vector<cv::String>file_paths;cv::glob(pattern,file_paths);for(size_ti=0;i<file_paths.size();i++){//......
  • c++ OpenCV 读取某个文件夹下的所有图片
    方案一:将文件夹中图像遍历到vector中#include<vector>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>std::vector<cv::Mat>ReadImage(cv::Stringpattern){std::vector<cv::String>fn;cv::glob(pattern,fn,false);......
  • 【c&c++】#define 宏的高级用法二
    一,宏的定义与撤销#普通宏定义#definePI3.14//编译阶段替换掉宏#defineT13+4//容易产生歧义#defineT2(3+4)//添加括号后,语义清楚floatr=1.0;floatarea=PI*r*r;inta=2*T1#宏替换后变成inta=2*3+4不符合本意inga......