构造函数、析构函数、拷贝构造函数,常函数

灰太狼 2022-06-11 07:08 502阅读 0赞
  1. //构造函数、析构函数、拷贝构造函数
  2. /*
  3. class Teacher{
  4. private:
  5. char *name;
  6. int age;
  7. public:
  8. //无参构造函数(写了,就会覆盖默认的无参构造函数)
  9. Teacher(){
  10. cout << "无参构造函数" << endl;
  11. }
  12. //有参构造函数会覆盖默认的构造函数
  13. Teacher(char *name, int age){
  14. this->name = name;
  15. this->age = age;
  16. cout << "有参构造函数" << endl;
  17. }
  18. };
  19. void main(){
  20. //Teacher t1;
  21. Teacher t2("yuehan",20);
  22. //另外一种调用方式
  23. Teacher t3 = Teacher("jack",21);
  24. system("pause");
  25. }
  26. */
  27. /*
  28. //析构函数
  29. class Teacher{
  30. private:
  31. char *name;
  32. int age;
  33. public:
  34. //无参构造函数赋默认值
  35. Teacher(){
  36. this->name = (char*)malloc(100);
  37. strcpy(name,"jack walson");
  38. age = 20;
  39. cout << "无参构造函数" << endl;
  40. }
  41. //析构函数
  42. //当对象要被系统释放时,析构函数被调用
  43. //作用:善后处理
  44. ~Teacher(){
  45. cout << "析构" << endl;
  46. //释放内存
  47. free(this->name);
  48. }
  49. };
  50. void func(){
  51. Teacher t1;
  52. }
  53. void main(){
  54. func();
  55. system("pause");
  56. }
  57. */
  58. //拷贝构造函数
  59. /*
  60. class Teacher{
  61. private:
  62. char *name;
  63. int age;
  64. public:
  65. Teacher(char *name, int age){
  66. this->name = name;
  67. this->age = age;
  68. cout << "有参构造函数" << endl;
  69. }
  70. //拷贝构造函数(值拷贝)
  71. //默认拷贝构造函数,就是值拷贝
  72. Teacher(const Teacher &obj){
  73. this->name = obj.name;
  74. this->age = obj.age;
  75. cout << "拷贝构造函数" << endl;
  76. }
  77. void myprint(){
  78. cout << name << "," << age << endl;
  79. }
  80. };
  81. Teacher func1(Teacher t){
  82. t.myprint();
  83. return t;
  84. }
  85. void main(){
  86. Teacher t1("rose",20);
  87. //拷贝构造函数被调用的场景
  88. //1.声明时赋值
  89. //Teacher t2 = t1;
  90. //t2.myprint();
  91. //2.作为参数传入,实参给形参赋值
  92. func1(t1);
  93. //3.作为函数返回值返回,给变量初始化赋值
  94. //Teacher t3 = func1(t1);
  95. //这里不会被调用
  96. //Teacher t1 ;
  97. //Teacher t2;
  98. //t1 = t2;
  99. system("pause");
  100. }
  101. */
  102. //浅拷贝(值拷贝)问题
  103. /*
  104. class Teacher{
  105. private:
  106. char *name;
  107. int age;
  108. public:
  109. Teacher(char *name, int age){
  110. this->name = (char*)malloc(100);
  111. strcpy(this->name,name);
  112. this->age = age;
  113. cout << "有参构造函数" << endl;
  114. }
  115. ~Teacher(){
  116. cout << "析构" << endl;
  117. //释放内存
  118. free(this->name);
  119. }
  120. void myprint(){
  121. cout << name << "," << age << endl;
  122. }
  123. };
  124. void func(){
  125. Teacher t1("rose", 20);
  126. Teacher t2 = t1;
  127. t2.myprint();
  128. }
  129. void main(){
  130. func();
  131. system("pause");
  132. }
  133. */
  134. //深拷贝
  135. /*
  136. class Teacher{
  137. private:
  138. char *name;
  139. int age;
  140. public:
  141. Teacher(char *name, int age){
  142. int len = strlen(name);
  143. this->name = (char*)malloc(len+1);
  144. strcpy(this->name, name);
  145. this->age = age;
  146. cout << "有参构造函数" << endl;
  147. }
  148. ~Teacher(){
  149. cout << "析构" << endl;
  150. //释放内存
  151. free(this->name);
  152. }
  153. //深拷贝
  154. Teacher(const Teacher &obj){
  155. //复制name属性
  156. int len = strlen(obj.name);
  157. this->name = (char*)malloc(len+1);
  158. strcpy(this->name,obj.name);
  159. this->age = obj.age;
  160. }
  161. void myprint(){
  162. cout << name << "," << age << endl;
  163. }
  164. };
  165. void func(){
  166. Teacher t1("rose", 20);
  167. Teacher t2 = t1;
  168. t2.myprint();
  169. }
  170. void main(){
  171. func();
  172. system("pause");
  173. }
  174. */
  175. //构造函数的属性初始化列表
  176. /*
  177. class Teacher{
  178. private:
  179. char* name;
  180. public:
  181. Teacher(char* name){
  182. this->name = name;
  183. cout << "Teacher有参构造函数" << endl;
  184. }
  185. ~Teacher(){
  186. cout << "Teacher析构函数" << endl;
  187. }
  188. char* getName(){
  189. return this->name;
  190. }
  191. };
  192. class Student{
  193. private:
  194. int id;
  195. //属性对象
  196. //Teacher t = Teacher("miss cang");
  197. Teacher t1;
  198. Teacher t2;
  199. public:
  200. Student(int id,char *t1_n, char* t2_n) : t1(t1_n), t2(t2_n){
  201. this->id = id;
  202. cout << "Student有参构造函数" << endl;
  203. }
  204. void myprint(){
  205. cout << id << "," << t1.getName() <<"," << t2.getName() << endl;
  206. }
  207. ~Student(){
  208. cout << "Student析构函数" << endl;
  209. }
  210. };
  211. void func(){
  212. Student s1(10, "miss bo", "mrs liu");
  213. //Student s2(20, "miss cang", "jason");
  214. s1.myprint();
  215. //s2.myprint();
  216. }
  217. void main(){
  218. func();
  219. system("pause");
  220. }
  221. */
  222. //C++ 通过new(delete)动态内存分配
  223. //C malloc(free)
  224. /*
  225. class Teacher{
  226. private:
  227. char* name;
  228. public:
  229. Teacher(char* name){
  230. this->name = name;
  231. cout << "Teacher有参构造函数" << endl;
  232. }
  233. ~Teacher(){
  234. cout << "Teacher析构函数" << endl;
  235. }
  236. void setName(char* name){
  237. this->name = name;
  238. }
  239. char* getName(){
  240. return this->name;
  241. }
  242. };
  243. void func(){
  244. //C++
  245. //会调用构造和析构函数
  246. Teacher *t1 = new Teacher("jack");
  247. cout << t1->getName() << endl;
  248. //释放
  249. delete t1;
  250. //C
  251. //Teacher *t2 = (Teacher*)malloc(sizeof(Teacher));
  252. //t2->setName("jack");
  253. //free(t2);
  254. }
  255. void main(){
  256. func();
  257. //数组类型
  258. //C
  259. //int *p1 = (int*)malloc(sizeof(int) * 10);
  260. //p1[0] = 9;
  261. //free(p1);
  262. //C++
  263. int *p2 = new int[10];
  264. p2[0] = 2;
  265. //释放数组 []
  266. delete[] p2;
  267. system("pause");
  268. }
  269. */
  270. //static 静态属性和方法
  271. /*
  272. class Teacher{
  273. public:
  274. char* name;
  275. //计数器
  276. static int total;
  277. public:
  278. Teacher(char* name){
  279. this->name = name;
  280. cout << "Teacher有参构造函数" << endl;
  281. }
  282. ~Teacher(){
  283. cout << "Teacher析构函数" << endl;
  284. }
  285. void setName(char* name){
  286. this->name = name;
  287. }
  288. char* getName(){
  289. return this->name;
  290. }
  291. //计数,静态函数
  292. static void count(){
  293. total++;
  294. cout << total << endl;
  295. }
  296. };
  297. //静态属性初始化赋值
  298. int Teacher::total = 9;
  299. void main(){
  300. Teacher::total++;
  301. cout << Teacher::total << endl;
  302. //直接通过类名访问
  303. Teacher::count();
  304. //也可以通过对象名访问
  305. Teacher t1("yuehang");
  306. t1.count();
  307. system("pause");
  308. }
  309. */
  310. //类的大小
  311. /*
  312. class A{
  313. public:
  314. int i;
  315. int j;
  316. int k;
  317. static int m;
  318. };
  319. class B{
  320. public:
  321. int i;
  322. int j;
  323. int k;
  324. void myprintf(){
  325. cout << "打印" << endl;
  326. }
  327. };
  328. void main(){
  329. cout << sizeof(A) << endl;
  330. cout << sizeof(B) << endl;
  331. //C/C++ 内存分区:栈、堆、全局(静态、全局)、常量区(字符串)、程序代码区
  332. //普通属性与结构体相同的内存布局
  333. //JVM Stack(基本数据类型、对象引用)
  334. //Native Method Stack(本地方法栈)
  335. //方法区
  336. system("pause");
  337. }
  338. */
  339. //this,当前对象的指针
  340. //函数是共享的,必须要有能够标识当前对象是谁的办法
  341. /*
  342. class Teacher{
  343. private:
  344. char* name;
  345. int age;
  346. public:
  347. Teacher(char* name,int age){
  348. this->name = name;
  349. this->age = age;
  350. cout << "Teacher有参构造函数" << endl;
  351. }
  352. ~Teacher(){
  353. cout << "Teacher析构函数" << endl;
  354. }
  355. //常函数,修饰的是this
  356. //既不能改变指针的值,又不能改变指针指向的内容
  357. //const Teacher* const this
  358. void myprint() const{
  359. printf("%#x\n",this);
  360. //改变属性的值
  361. //this->name = "yuehang";
  362. //改变this指针的值
  363. //this = (Teacher*)0x00009;
  364. cout << this->name << "," << this->age << endl;
  365. }
  366. void myprint2(){
  367. cout << this->name << "," << this->age << endl;
  368. }
  369. };
  370. void main(){
  371. Teacher t1("jack",20);
  372. const Teacher t2("rose", 18);
  373. //t2.myprint2(); 常量对象只能调用常量函数,不能调用非常量函数
  374. //常函数,当前对象不能被修改,防止数据成员被非法访问
  375. printf("%#x\n", &t1);
  376. t1.myprint();
  377. printf("%#x\n", &t2);
  378. t2.myprint();
  379. system("pause");
  380. }
  381. */

浅拷贝是值拷贝,因为对象的值为地址,所以拷贝的也就是地址,深拷贝是重新开辟空间,拷贝的是内容

浅拷贝图:

Center

深拷贝:

Center 1

发表评论

表情:
评论列表 (有 0 条评论,502人围观)

还没有评论,来说两句吧...

相关阅读

    相关 构造函数函数

    构造函数和析构函数是面向对象编程中的重要概念,它们在对象的创建和销毁过程中起着关键作用。构造函数用于初始化对象的状态,而析构函数则负责在对象被销毁时执行清理操作。在本文中,我们

    相关 构造函数函数

    构造函数      先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构

    相关 构造函数函数

    构造函数      先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构

    相关 拷贝构造函数函数

    一、拷贝构造函数 (一)、何为拷贝? 拷贝一词来源于英文中的copy,译为:抄写,复制,复制品。将原有物件,按照同样式的在来一份。 \\举个栗子: 饭点到了,和