构造函数_析构函数_深拷贝与浅拷贝

C++提供构造函数和析构函数用于 数据成员的初始化和清理。

构造函数:

定义:

1、C++定义与类名相同的特殊成员函数,即构造函数。

2、有参或无参。

3、无返回类型。

调用:

自动调用,C++编译器会自动调用构造函数;

手动调用:在一些情况需要手动调用。

先后定义两个对象T1和T2,构造函数先调用T1后调用T2,析构函数倒序调用,先调用T2后调用T1。

无参构造函数:

在类外定义对象后,自动调用无参构造函数,并在内部进行对象数据成员的赋值;

有参构造函数:

括号法:Text T1(3,4);

等号法:Text T2 = (1,2,3,4);   //逗号表达式将最右边的数字返回。一个参数

手动调用:Text T3 = T1(3,4);  //对象的初始化,赋值构造函数

Text T4 ;   T4 = T3;    //对象的赋值  调用的是C++自带的 operator = () 或者用户重载的等号操作函数。

对象的初始化 与 对象的赋值 是不同的概念。

拷贝(copy)构造函数:用1个对象去初始化另一个对象 :

1、Text T2 = T1;

2、Text T2(T1);

3、 调用f(T2)时,p调用拷贝构造函数,用T2完成自己的初始化。此时,p是一个与T2等价的元素(非指针,非引用)

void f(Text p)
{
     cout << p.fun() << endl;
} 

4、函数的返回值是一个元素,返回的是一个匿名对象,所以会调用匿名对象类的拷贝构造函数

void display()
{
     g();            //析构A后,匿名对象未使用,匿名对象析构。//  Text m = g();    匿名对象初始化一个同类型的对象,匿名对象转成有名对象//  Text n(1,2);//  n = g();         匿名对象  赋值 给另外一个同类型的对象,匿名对象被析构。}
Text g()
{
     Text A(1,2);  //调用有参构造函数
     return A;     //调用拷贝构造函数,创建一个匿名对象。
}

 构造函数调用规则研究:

在定义类时,没有写构造函数,C++编译器会提供一个默认构造函数。

写了构造函数就必须要使用它。

浅拷贝问题:(自己编写拷贝构造函数即可:主要针对有指针成员)

1、拷贝构造函数

Text obj2 = obj1;       //调用obj2的拷贝构造函数  Text(Text& zty) {}

如果Text里面有两个变量,其中一个为指针。

char* p;

int len;

如果没有定义拷贝构造函数,就会调用C++自带的拷贝构造函数,这个时候:

obj1的成员变量p和len都在栈区,p指针存放的是地址信息,指向堆中的数据(全局变量区复制过来的,注意:全局变量区和堆区都有这部分数据)

C++自带的拷贝构造函数,执行了浅拷贝,只是在栈区把p和len复制了一份给obj2,故p也指向堆中的数据区域。在两个变量生命周期结束,需要析构时,obj2正常析构,数据析构,指针复NULL,obj1中的p就变成了野指针。

 2、等号操作符

Text obj1("sf");

Text obj2("safdsg");  //调用类中的有参构造函数

obj2 = obj1;  //如果不自己重载operator=(),则调用C++自己的=操作符进行p和len简单的值拷贝,指针所指的堆中区域没有拷贝,obj1和obj2中的指针p都指向堆中相同区域的数据。

构造函数的初始化列表:

解决了在B类中组合了一个A类对象的(其中,A类设计了构造函数)

根据构造函数的调用规则,设计A的构造函数,必学要用,在B中没有机会初始化A

新的语法:

class A
{
public:
        A(int _a)
        {
          a = _a;
        }
        ~A() {}
private:
       int a;
}
class B
{
 public:
       B::B(int _b1):a2(2),a3(3)
       {
          b1 = _b1;
       }
B::B(int _b1, int v2, int v3):a2(v2),a3(v3)
{
   b1 = _b1;
}
private:
       int b1;
       A   a2;
       A   a3;
}
void main()
{
    B zty(1);
    B lunais(1,2,3);
}

// 先执行被组合对象的构造函数A,按照定义顺序,而不按照初始化列表顺序。析构函数相反。

如果类中有const对象,必须用初始化列表进行赋初值

class B
{
 public:
       B::B(int _b1):a2(2),a3(3),c(20)
       {
          b1 = _b1;
       }
B::B(int _b1, int v2, int v3):a2(v2),a3(v3),c(20)  //c也可以赋值为其他值
{
   b1 = _b1;
}
private:
       const int c;
       int b1;
       A   a2;
       A   a3;
}
时间: 2024-10-25 20:32:22

构造函数_析构函数_深拷贝与浅拷贝的相关文章

C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

 目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件.................................................................................................

C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)

1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省构造函数初始化对象,缺省构造函数会将全部数据成员都初始化为零或       空.缺省构造函数是不带參数的构造函数. >创建一个对象时,系统自己主动调用构造函数. 构造函数的特点: 1.构造函数能够重载,传入什么实參决定调用不同版本号的构造函数. 2.构造函数不能声明为const .也不能声明为virtu

拷贝构造函数(二)——深拷贝与浅拷贝

拷贝构造函数(一)--哲学三连:http://www.cnblogs.com/tenjl-exv/p/8017814.html 拷贝构造函数(二)--深拷贝与浅拷贝:http://www.cnblogs.com/tenjl-exv/p/8017909.html 拷贝构造函数(三)--重载赋值运算符:http://www.cnblogs.com/tenjl-exv/p/8017983.html

C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝、空类与空数组

C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝.空类与空数组 一.深拷贝与浅拷贝 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象. 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换而言之,深拷贝把要复制的对象所引用的对象都复制了一遍. 浅拷贝可

C++_构造函数与析构函数

构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造函数 5 拷贝构造函数 5.1 自定义拷贝构造函数 5.2 缺省的拷贝构造函数 5.3 调用拷贝构造函数的三种情况 5.4 浅拷贝和深拷贝 6 析构函数 7 调用构造函数和析构函数的顺序 8 对象的生存期 构造函数和析构函数都是类的成员函数,但它们都是特殊的成员函数,执行特殊的功能,不用调用便自动执

引用传递与值传递______深拷贝与浅拷贝______构造函数与析构函数

引用传递.值传递.指针传递: https://www.cnblogs.com/ducongcong/p/6912164.html 深拷贝与浅拷贝: https://blog.csdn.net/caoshangpa/article/details/79226270 总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针. 文末有两个链接,关于智能指针和实现string类,非常不错 构造函数与析

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化

【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3977861.html 一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream

c++拷贝构造函数(深拷贝,浅拷贝)详解

一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a=b; printf("con