[C++ 从入门到精通] 11.拷贝构造函数

这篇具有很好参考价值的文章主要介绍了[C++ 从入门到精通] 11.拷贝构造函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨


一. 定义

拷贝构造函数:如果一个类构造区数的第一个参数是所属的类类型的引用。如果后面还有其他额外参数,并且后面这些额外的参数还都有默认值,则这个构造函数就叫拷贝构造函数。

注意:拷贝构造函数默认参数必须放在函数声明中,除非该函数没有函数声明。

建议:

  1. 拷贝构造函数第一个参数总是带着const,作用参考前面的文章:传送门
  2. explicit:拷贝构造函数一般不要声明成explicit(禁止隐式转换),作用参考前面的文章:传送门
class Time
{
public:
	Time();
	int Hour;
	int Minute;
	int Second;
	
	//拷贝构造函数(在类对象赋值的时候,给对象一些值),
	Time(const Time &tmptime,int a = 5);
};

Time::Time():Hour(11), Minute(58), Second(49)
{
	std::cout << "调用了Time::Time()构造区数" << std::endl;
}

Time::Time(const Time &tmptime, int a):Hour(12),Minute(59), Second(50)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}

二. 调用场景

作用会在一定的时机(定义类对象的同时被赋值),被系统默认调用。

如:

int main()
{
	Time myTime;               //调用默认构造函数(不带参数)
	Time myTime2 = myTime;     //调用拷贝构造函数
	Time myTime3(myTime);      //调用拷贝构造函数
	Time myTime4{ myTime };    //调用拷贝构造函数
	Time myTime5 = { myTime }; //调用拷贝构造函数
	Time myTime6;              //调用默认构造函数(不带参数)
	myTime6 = myTime5;         //从运行结果来看,没有调用拷贝构造函数,后面在拓展,这里暂不考虑

    system("pause");
	return 0;
}

[C++ 从入门到精通] 11.拷贝构造函数,# C++从入门到精通,c++,开发语言

此外,还有其他调用拷贝构造函数的情景:

1、将一个对象作为实参传递给一个非引用类型的形参。

void func(Time tmptime)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}
int main()
{
	Time myTime;
	func(myTime);	
}

运行结果:

[C++ 从入门到精通] 11.拷贝构造函数,# C++从入门到精通,c++,开发语言

2、从一个函数中返回一个对象的时候。

Time func()
{
	Time tmpTime;
	return tmpTime;  //系统产生了临时对象并且调用了类的拷贝构造函数
}
int main()
{
	func();	 //等价于 Time myTime = func();
}

运行结果:

[C++ 从入门到精通] 11.拷贝构造函数,# C++从入门到精通,c++,开发语言

3、还有一些其他调用拷贝构造函数的情况以后补充。


三. 其他特性

我们前面说过,默认情况下,类对象的拷贝是每个成员变量的逐个拷贝。

成员变量逐个拷贝的功能因为定义的拷贝构造函数的存在而丢失了作用,或者说我们自己定义的拷贝构造函数取代了系统默认的每个成员变量逐个拷贝的这种行为。

a) 如果我们没有为类定义拷贝构造函数,编译器就会帮我们定义一个“合成拷贝构造函数”。

b) 编译器帮我们定义的“合成拷贝构造函数”一般也是将类对象tmptime的成员逐个拷贝到正在创建的对象中(Time myTime2 = myTime)。
每个成员的类型决定它如何拷贝:

  • 若是整型的,那么就直接把值拷贝过来赋值给正在创建的类对象;
  • 若是类类型的,那么就调用类类型的这个类的拷贝构造函数来拷贝赋值给正在创建的类对象(若自己定义了类A的拷贝构造函数,则不会调用在类A声明的类B的拷贝构造函数,只调用类B构造函数);

c) 如果自己定义了拷贝构造函数,那么系统就不会在定义“合成拷贝构造函数”,这时必须在自己定义的拷贝构造函数给类成员赋值,以免出现类成员没有被赋值就使用的情况发生。

假设我们在类成员函数中,对成员变量进行赋初值,而在拷贝构造函数中,不对成员变量进行赋初值。

Time::Time():Hour(11), Minute(58), Second(49)
{
	std::cout << "调用了Time::Time()构造区数" << std::endl;
}

Time::Time(const Time &tmptime, int a)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}

运行结果如下:所以必须在自己定义的拷贝构造函数给类成员赋值

[C++ 从入门到精通] 11.拷贝构造函数,# C++从入门到精通,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-831626.html


态度"ABC"理论的三个维度,即情感(Affective)、行为(Behavioral)和认知(Cognitive)

到了这里,关于[C++ 从入门到精通] 11.拷贝构造函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++:构造方法(函数);拷贝(复制)构造函数:浅拷贝、深拷贝;析构函数。

    1.构造方法(函数) 构造方法是一种特殊的成员方法,与其他成员方法不同: 构造方法的名字必须与类名相同; 无类型、可有参数、可重载 会自动生成,可自定义 一般形式:类名(形参); 例: Stu(int age); 当用户没自定义构造方法时,系统将会执行默认构造方法,当用户自定义一个

    2024年02月11日
    浏览(29)
  • C++ 类和对象(二)构造函数、析构函数、拷贝构造函数

            本文将介绍类的6个默认成员函数中的构造函数、析构函数和拷贝构造函数,赋值重载和取地址重载涉及运算符重载的知识,将在下篇讲解。所谓默认成员函数,也就是每个类都有的成员函数,我们可以显式定义这些函数,否则,编译器会自动生成它们。 目录 前言

    2024年02月09日
    浏览(33)
  • 【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构

    2024年02月06日
    浏览(36)
  • C++——拷贝构造函数

    (用旧对象去构造新对象) 拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 参数的类型:   值类型(不行,会产生递归); 指针类型(能实现要求,但会出现歧义(感觉a的地址给b构造));

    2024年02月02日
    浏览(25)
  • 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

       🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:   目录 类的6个默认成员函数 构造函数 特性  析构函数 特性  析构的顺序 拷贝构造函数 特性 常引用      💬 hello! 各位铁子们大家好哇。              今日更新了类与对象的构造函数、

    2024年02月21日
    浏览(31)
  • 『C++成长记』拷贝构造函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 📒1.1拷贝构造函数的概念 📒1.2拷贝构造函数的写法 📒1.3编译器生成的拷贝构造 📒1.4拷贝构造函数的用法 📒1.5拷贝构造函数典型调

    2024年02月04日
    浏览(30)
  • ⚡【C++要笑着学】(7) 默认成员函数:构造函数 | 析构函数 | 拷贝构造函数

    🔥 订阅量破千的火热 C++ 教程 👉 火速订阅 《C++要笑着学》   🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅!   本篇

    2024年02月07日
    浏览(49)
  • 【C++杂货铺】拷贝构造函数

    📖 定义 拷贝构造函数 是构造函数的一个重载 ,它的本质还是 构造函数 ,那就意味着,只有在创建对象的时候,编译器才会自动调用它,那他和普通的构造函数有什么区别呢? 拷贝构造函数,是创建对象的时候,用一个已存在的对象,去初始化待创建的对象 。简单来说,

    2024年02月16日
    浏览(35)
  • c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

    设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

    2024年02月11日
    浏览(26)
  • C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造

    构造函数是 C++ 中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。 C++ 支持多种类型的构造函数,用于满足不同的初始化需求: 默认构造函数: 不带参数的构造函数,通常用于初始化

    2024年04月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包