28)拷贝构造函数

1)由已存在的对象,创建新对象,也就是说新对象,不由构造器来构造,而是由拷贝构造器来完成。

2)拷贝构造器的格式:
  

1 class 类名
2 {
3    类名(const 类名 & another)
4           {
5             拷贝构造体
6            }
7
8 }

3)拷贝构造函数,为啥是只读的,因为我仅仅是用它来初始化自己,我不会改变那个对象的值,所以加一个const保护起来

4)

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Test
 5 {
 6 public:
 7     Test()
 8     {
 9         m_x=1000;
10         m_y=100090;
11     }
12     Test(int x,int y)
13     {
14     m_x=x;
15     m_y=y;
16
17     }
18     void print_T()
19     {
20         cout<<"x="<<m_x<<endl<<"y="<<m_y<<endl;
21     }
22     //拷贝构造函数,为啥是只读的,因为我仅仅是用它来初始化自己,我不会改变那个对象的值,所以加一个const保护起来
23     Test(const Test &another)
24     {
25         m_x=another.m_x;
26         m_y=another.m_y;
27     }
28     private:
29     int m_x;
30     int m_y;
31 };
32
33 int main()
34 {
35     Test t1;
36     Test t2(t1);//就是我初始化t2,叫t1给我初始化,但是,这个函数怎么写呢,就是编写一个拷贝函数。
37     //居然能编译通过,就说明,系统有一个默认这种接口,所以 才没有报错
38
39
40     //写一个显式的拷贝构造函数
41     //啥是 拷贝对象,就是用和我同一个类的对象来初始化自己。
42
43     t2.print_T();
44
45
46
47
48
49
50
51
52     return 0;
53 }

5)即使我不写那个拷贝构造函数  其实用另一种方式初始化 也是可以的

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Test
 5 {
 6 public:
 7     Test()
 8     {
 9         m_x=1000;
10         m_y=100090;
11     }
12     Test(int x,int y)
13     {
14     m_x=x;
15     m_y=y;
16
17     }
18     void print_T()
19     {
20         cout<<"x="<<m_x<<endl<<"y="<<m_y<<endl;
21     }
22
23
24     /*Test(const Test &another)
25     {
26         m_x=another.m_x;
27         m_y=another.m_y;
28     }*/
29
30     private:
31     int m_x;
32     int m_y;
33 };
34
35 int main()
36 {
37     Test t1;
38     //Test t2(t1);
39
40     Test t2=t1;//其实下面这个和上面的那个是一样的效果
41     t2.print_T();
42     return 0;
43 }

6)但是,如果我的代码这样写,就是调用的是Test的拷贝构造函数

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Test
 5 {
 6 public:
 7     Test()
 8     {
 9         m_x=1000;
10         m_y=100090;
11     }
12     Test(int x,int y)
13     {
14     m_x=x;
15     m_y=y;
16
17     }
18     void print_T()
19     {
20         cout<<"x="<<m_x<<endl<<"y="<<m_y<<endl;
21     }
22     private:
23     int m_x;
24     int m_y;
25 };
26
27 int main()
28 {
29     Test t1;
30     Test t2;
31     t2=t1;//这个调用的不是Test的拷贝操作符函数,而是Test的赋值操作符函数(就是那个操作符函数重载)
32     t2.print_T();
33
34     return 0;
35 }

调的是

1 void  operator=(const Test &another)
2 {
3     m_x=another.m_x;
4     m_y=another.m_y;
5 }

8) 当我一个函数返回一个对象,如果在函数外部没有任何变量去接收它,这个对象将不会再被使用,(找不到),编译会直接将这个匿名对象回收掉,而不是等待函数执行完毕再回收。

9)

    

      这个func2()返回一个对象,因为 return  Test1,(其实仅仅Test1的值,所以  这个函数返回了,就作为一个匿名对象出现)

      这样,那个匿名对象有了名字,就不会被回收了,然后  就不会调用析构了。

     

      不懂  可以看  台式机的:

        C:\Documents and Settings\Administrator\桌面\C++基础教程完整版视频\02_C++基础\day03\3_视频  --第七个

10)

原文地址:https://www.cnblogs.com/xiaoyoucai/p/8183225.html

时间: 2024-11-04 06:11:09

28)拷贝构造函数的相关文章

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

拷贝构造函数

类进行拷贝初始化时会调用拷贝构造函数,拷贝初始化发生在以下几种情况中: [1] 有"="的地方会发生拷贝; [2] 将一个对象作为参数传递给一个非引用的对象时; [3] 从一个返回类型为引用的类型的函数返回一个对象; [4] 用花括号初始化一个数组中的元素; 拷贝构造函数的形参必须为引用类型,我认为应该有两点原因: 1. 在类的类部定义该类的对象,只能定义为引用类型或指针类型,因为其属于不完全类型: 2. 如果不定义为引用就会陷入无限的循环--调用拷贝构函数,必须拷贝它的实参,而拷贝它

C++知识点:拷贝构造函数例子

//拷贝构造函数: //函数参数传递时调用一次拷贝构造函数,给对象赋值时调用一次拷贝构造函数,对象作为参数传递后会被及时销毁. #include <fstream> #include <string> using namespace std; ofstream out("HowMany2.out"); class HowMany2 { string name;//object identifier static int objectCount; public:

拷贝构造函数的用法

1.拷贝构造函数是与类名相同,其形参是本类的对象的引用. 2.拷贝构造函数会在以下三种情况下被调用: 1).当用类的一个对象去初始化该类的另一个对象时. 2).如果函数的形参是类的对象,调用该函数,将对象作为函数实参传递给函数的形参时. 3).如果函数的返回值是类的对象,函数执行完成,将返回值返回时. 3.浅拷贝的失败例子: 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 7 class

C++拷贝构造函数(深拷贝与浅拷贝)

转自http://blog.csdn.net/lwbeyond/article/details/6202256/ 一. 什么是拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 1 #include <iostream> 2 using namespace std; 3 4 class CExample { 5 private: 6 in

拷贝构造函数 Vs 赋值运算函数

1.拷贝构造函数:用已经创建对象初始化新的对象,首先是一个构造函数,在调用时候产生对象,通过参数传递对其进行初始化 2.赋值运算函数:operator():将一个对象赋值给一个原有对象,所以原有的对象中的内存必须进行释放同时判断两个对象是是不是同一个对象 1 /*赋值运算符号*/ 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 class CMyString 7 { 8 private: 9 ch

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对象相同,而复制操作符需要这个操作,另外赋值运算符中如果原来对象中有内存分配,要先把内存释放掉. 下面是String类的一个实现的部分函数,可以看出二者的区别. 1 class String{ 2 public:

从一个例子讲解拷贝构造函数与return

1 #include "iostream" 2 using namespace std; 3 4 5 class Location 6 { 7 public: 8 Location(int xx = 0, int yy = 0) 9 { 10 X = xx; Y = yy; 11 cout << X << "," << Y << " Constructor Object." << end

【编程题】编写String类的构造函数、拷贝构造函数、析构函数和赋值函数

[编程题]编写String类的构造函数.拷贝构造函数.析构函数和赋值函数 [题目]:请编写如下4个函数 1 class String 2 { 3 public: 4 String(const char *str = NULL);// 普通构造函数 5 String(const String &other); // 拷贝构造函数 6 ~ String(void); // 析构函数 7 String & operate =(const String &other);// 赋值函数 8