【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy
C++ 函数 拷贝 构造函数 copy 学院 析构
2023-09-14 08:57:16 时间
3.拷贝构造函数
第二种场景:()
第三种场景:对象以值传递的方式传入函数参数
第四种场景:对象以值传递的方式从函数返回![](http://img.blog.csdn.net/20150126145228234)
![](http://img.blog.csdn.net/20150126145344014)
高效学 C++|组合类的构造函数 设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二) 朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 初学者 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 一键三连 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ ・)ノ
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一) 朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 初学者 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 一键三连 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ ・)ノ
拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
当我们没有编写拷贝构造函数的时候,c++编译器会默认给我们提供一个拷贝构造函数,执行的是浅拷贝。
copy构造函数四种应用场景;
#include iostream using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) a = b; //拷贝构造函数 CExample(const CExample C) a = C.a; //一般函数 void Show() cout a endl; int main() CExample A(100); CExample B = A; //注意这里的对象初始化要调用拷贝构造函数,而非赋值 // CExample B(A); 也是一样的 B.Show(); return 0; }
第二种场景:()
#include iostream using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) a = b; //拷贝构造函数 CExample(const CExample C) a = C.a; //一般函数 void Show() cout a endl; int main() CExample A(100); //CExample B = A; //注意这里的对象初始化要调用拷贝构造函数,而非赋值 CExample B(A); //也是一样的 B.Show(); return 0; }
第三种场景:对象以值传递的方式传入函数参数
#include iostream using namespace std; class CExample private: int a; public: //构造函数 CExample(int b) a = b; cout "creat: " a endl; //拷贝构造 CExample(const CExample C) a = C.a; cout "copy" endl; //析构函数 ~CExample() cout "delete: " a endl; void Show() cout a endl; //全局函数,传入的是对象 void g_Fun(CExample C) cout "test" endl; int main() CExample test(1); //传入对象 g_Fun(test); return 0; }
第四种场景:对象以值传递的方式从函数返回
#include iostream using namespace std; class CExample private: int a; public: //构造函数 CExample(int b=0) a = b; cout "a:" a endl; ~CExample() cout "destroy a:" a endl; //拷贝构造 CExample(const CExample C) a = C.a; cout "copy a:" a endl; //全局函数 CExample g_Fun() CExample temp(10); return temp; int main() CExample ret; ret = g_Fun(); return 0; }添加断点,逐条语句运行,观察程序的执行步骤以及打印输出:
#include "iostream" using namespace std;
name obj1("name1"); //如果你不写copy构造函数,那么C++编译器会给我们提供一个默认的copy构造函数 (浅cpy) name obj2 = obj1; //如果你不写=操作,那么C++编译器会给我们提供一个=操作函数 (浅cpy) obj2 = obj1; cout obj2.getPn() endl; void main() playmain(); system("pause"); }
#define _CRT_SECURE_NO_WARNINGS #include "iostream" using namespace std; class name public: name(char *pn); name(name obj) cout " copy Constructing " endl; char *pn = obj.getPn(); pname = (char *)malloc(strlen(pn) + 1); if (pname != NULL) strcpy(pname, pn); //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; size = strlen(pn); ~name(); protected: char *pname; int size; public: char * getPn() return pname; void operator=(name obj1) cout " 执行=操作" endl; if (pname != NULL)//此处有一个疑问:如果不free, 直接将原来的内存进行重新赋值 char *pn = obj1.getPn(); strcpy(pname, pn); pname[0] = N; size = strlen(pn); void operator=(name obj1) cout " 执行=操作" endl ; if (pname != NULL)//此处有一个疑问:如果不free, 直接将原来的内存进行重新赋值 free(pname); pname = NULL; size = 0; char *pn = obj1.getPn(); pname = (char *)malloc(strlen(pn) +1); if (pname!=NULL) strcpy(pname,pn) ; //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; pname[0] = m; size = strlen(pn) ; name::name(char *pn) cout " Constructing " pn endl; pname = (char *)malloc(strlen(pn) + 1); if (pname != 0) strcpy(pname, pn); //pname = new char[strlen(pn)+1] ; //if (pname!=0) strcpy(pname,pn) ; size = strlen(pn); name :: ~name() cout " Destructing " pname endl; pname[0] = \0; //delete []pname ; free(pname); size = 0; int playmain() name obj1("name1"); name obj3("name3"); //如果你不写copy构造函数,那么C++编译器会给我们提供一个默认的copy构造函数 (浅cpy) name obj2 = obj1; //做业务逻辑 //此处省略500行 //如果你不写=操作,那么C++编译器会给我们提供一个=操作函数 (浅cpy) //会调用对象2 的=号操作函数, obj3是形参, obj2干什么去了? obj2 = obj3; cout obj2.getPn() endl; return 0; int main() playmain(); //system("pause"); return 0; }
最终分析图:
高效学 C++|组合类的构造函数 设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二) 朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 初学者 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 一键三连 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ ・)ノ
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一) 朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 初学者 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 一键三连 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ ・)ノ
相关文章
- C++构造函数、拷贝构造函数、赋值运算符漫谈(二)——函数返回值
- C++构造函数、拷贝构造函数、赋值运算符漫谈(一)——函数参数传递
- [C++]“error C2712: 无法在要求对象展开的函数中使用__try”解决方案
- 【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强
- dev c++ Boost库的安装
- C++的函数重载
- 【C++】基础及引用
- C++ 虚函数表解析
- c++模板学习07之类模板中成员函数创建时机
- c++文件操作3之二进制写文件
- C++:C++编程语言学习之实现约瑟夫环问题——利用函数嵌套+交互式实现n只猴子选猴王
- C++设计模式:组合模式
- VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本号,或者预编译头为 C++ 而在 C 中使用它(或相反)
- 解答私信@被c++折磨头秃的花季美少女 //C++ 利用指针数组输入10个单词,编写函数对10个单词进行排序并输出,要求判断是否有相同的单词,如果有相同的单词在输出时该单词只输出一次。
- 第十届蓝桥杯大赛软件类省赛C/C++大学B组-试题 A: 组队
- C++ string数组字符串排序 sort
- c++ 副本构造函数 函数实参 形参 c++入门经典 11 17 章
- linux 下 c++ clock 函数理解
- C++函数模板的重载
- C++用顶层函数重载操作符(二) 顶层函数的优势
- C++虚析构函数
- VC++ 创建桌面、开始菜单快捷方式(附源码)
- Windows和Linux下排查C++软件异常的常用调试器与内存检测工具详细介绍
- C++中全局变量、函数与静态变量、函数的区别
- C++Premer Plus学习(五)——函数探幽
- C++11 强类型枚举
- 黑马C++笔记——函数对象(仿函数)
- C++,STL -- 函数对象、常用算法
- C++编程经验(2):为虚基类做虚析构函数的必要性
- C++使用技巧(二十一):makefile编写