C++分析构造函数与析造函数的特点梳理

目录
  • 构造函数的调用
    • 构造函数的分类及调用
    • 拷贝构造的调用时机
  • 深拷贝与浅拷贝

构造函数的调用

默认情况下编译器至少给一个类添加3个函数

1.默认构造函数(无参,函数体实现)--完成对象的初始化

2.默认析构函数(无参,函数体为空)--完成对象的清理

3.默认拷贝构造函数,属性进行值拷贝

规则:

如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造

如果用户定义了拷贝构造函数,c++不会在提供其他函数

类名(){}

构造函数的语法

1,没有返回值,也不写void;

2,函数名称与类名相同;

3,构造函数可以有参数,因此可以发生重载;

4,程序在调用对象时会自动调用构造函数,无需手动调用且只调用一次

析造函数~类名()

1.析造函数,没有返回值也不写void

2.函数名称与类名相同在前面加上~

3.构造函数不可以有参数,因此不可以发生重载

4.程序在对象销毁会自动调用析构,与构造函数的调用规则相同

构造函数的分类及调用

1.按照参数分类为 无参构造和 有参构造

class person
{
public:
    person()
    {
    cout<<"无参构造的调用"<<endl;
    }
    person(int a)
    {
    cout<<"有参构造的调用"<<endl;
    }
};

2.按照类型分为 普通构造和 拷贝构造

person(const person& p)
{
}

拷贝构造的语法

调用构造函数的方法

void test()
{
    //1.括号法
    person p1;//默认无参构造调用
    person p2(10);//默认有参构造的调用
     preson p3(p2);//拷贝构造的调用;
    //若是这样写 下面这行代码会被认为是编译器的声明
     person p1();  // void func();
   // 无法完成函数的调用
    2.显示法
    person p1;
    person p2=person(10);
    person p3=person(p2);
    // 匿名对象
   person(10);//特点:当前行执行结束后,系统会立即回收匿名对象
    // 3.隐式转换法
    person p4=10;// 相当于 写了 person p4 =person(10);
    person p5=p4;
}

拷贝构造的调用时机

1.使用一个已经创建完毕的对象来初始化一个新对象

2.值传递的形式给函数参数传值

class p
{
};
void dowork(person p )//形参p
{
}
void test02()
{
    person p;
    dowork(p);// 相当于发生了隐式类型转换 传入值拷贝 person p=p;
}

3.值方式返回局部对象

深拷贝与浅拷贝

如果利用编译器提供的拷贝构造函数

会做浅(值)拷贝的操作(会使得new的对象指针指向同一个地址),会带来对堆区内存持续释放的问题

如果堆区开辟了内存,可以在析构函数中释放;

对于拷贝构造函数,可以自己实现一个拷贝构造函数(深拷贝)(new一个新的对象实现拷贝构造)

总结: 如果属性有在堆区开辟,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

初始化列表

c++提供了初始化列表语法用来初始化属性

class person
{
    person(int a,int b,int c):m_a(a),m_b(b),m_c(c);
    {
    }
    int m_a;
    int m_b;
    int m_c;
};

到此这篇关于C++分析构造函数与析造函数的特点梳理的文章就介绍到这了,更多相关C++构造函数与析造函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++构造函数详解

    文章转自公众号:Coder梁(ID:Coder_LT) 上一篇文章我们介绍了定义了类,在使用之前,往往还需要对类进行初始化.这篇介绍的就是对类进行初始化的方法. 像是结构体,我们可以使用列表初始化的方法进行初始化: struct Thing {     char *pn;     int m; }; Thing th = {"hello", 23}; 但类不行,因为结构体当中的成员变量都是public的,而类往往是私有的.这意味着我们不能直接用程序访问数据成员,需要设计成函数. 在C+

  • C++中的构造函数与析造函数详解

    C++中的构造函数与析造函数详解  构造函数的概念 (1)构造函数是特殊的成员函数         (2)当创建类类型的新对象时,系统自动会调用构造函数         (3) 构造函数是为了保证对象的每个数据成员都被正确的初始化.         创建构造函数的注意事项: (1) 函数名与类名相同:         (2) 没有返回类型,返回类型也不能是void型         (3) 构造函数通常情况下声明为public,否则不能像其它成员函数那样被显示的调用         (4) 构造

  • c++特殊构造函数详解

    目录 前言 拷贝构造函数 一.什么是拷贝构造函数 二.调用时机 注意 浅拷贝和深拷贝 总结 前言 众所周知,构造函数的作用是类在创建对象时的初始化,而拷贝构造函数则是构造函数里的一种特殊构造. 拷贝构造函数 拷贝构造:是C++特有的,他是一种特殊的构造函数 用于基于一个同一个类的的第一个对象去创造和初始化的一个对象 第一的参数是本类的对象的引用(const) 一.什么是拷贝构造函数 一种特殊的构造函数,同一个类的一个对象去创造或初始化一个对象 在没写的时候,是默认存在的,自己写了之后,系统默认的

  • C++构造函数一些常见的坑

    文章转自微信 公众号:Coder梁(ID:Coder_LT) 某一天我们接到了一个需求,需要开发一个类似于STL中string的类. 我们很快写好了代码: #include <iostream> #ifndef STRINGBAD_H_ #define STRINGBAD_H_ class StringBad {     private:      char *str;      int len;      static int num_strings;     public:      St

  • C++中构造函数详解

    构造函数按参数为为:有参构造函数和无参构造函数 按类型分为:普通构造函数和拷贝构造函数 构造函数的三种调用方法:括号法,显示法,隐式转换法: //括号法 Person p1; //默认构造 无参构造 Person p2(13); //有参构造 Person p3(p2); //拷贝构造 //注意:使用无参构造时不要写括号.不然系统会认为该语句是函数声明. 例:Person p1(); //显示法 Person p1; Person p2 = Person(13);//有参构造 Person p3

  • C++分析构造函数与析造函数的特点梳理

    目录 构造函数的调用 构造函数的分类及调用 拷贝构造的调用时机 深拷贝与浅拷贝 构造函数的调用 默认情况下编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体实现)--完成对象的初始化 2.默认析构函数(无参,函数体为空)--完成对象的清理 3.默认拷贝构造函数,属性进行值拷贝 规则: 如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造 如果用户定义了拷贝构造函数,c++不会在提供其他函数 类名(){} 构造函数的语法 1,没有返回值,也不写void: 2,函数名称与

  • php源码分析之DZX1.5随机数函数random用法

    本文实例讲述了php源码分析之DZX1.5随机数函数random用法.分享给大家供大家参考.具体如下: <?php /** * @param int $length: 随机数长度 * @param int $numeric: 0或非0,其中0表示随机数由全数字组成,非0表示随机数由全字母组成 * @return string: 返回生成的随机数 */ function random($length, $numeric = 0) { $seed = base_convert(md5(microti

  • c++ 构造函数中调用虚函数的实现方法

    我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { public: A ():m_iVal(0){test();} virtual void func() { std::cout<<m_iVal<<' ';} void test(){func();} public: int m_iVal; }; class B : public A {

  • 详细分析C++ 多态和虚函数

    多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 下面的实例中,基类 Shape 被派生为两个类,如下所示: #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a;

  • C++分析讲解类的静态成员函数如何使用

    目录 一.未完成的需求 二.问题分析 三.静态成员函数 四.小结 一.未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 在[C++基础入门]20.C++中类的静态成员变量中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码: #include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() {

  • MYSQL函数的使用梳理

    目录 MYSQL函数 1:聚合函数 2:数学函数 2:字符串函数 3:日期函数 4:控制流函数 5:窗口函数 5.1 序号函数 5.2 分布函数 5.3 前后函数 5.4 头尾函数 5.5 其他函数 5.6 开窗聚合函数 MYSQL函数 1:聚合函数 聚合函数主要由:count,sum,min,max,avg,group_count() 重点说一下group_count()函数,首先根据group by指定的列进行分组,并且用分隔符分隔,将同一个分组中的值连接起来,返回一个字符串结果. 格式 :

  • Python构造函数及解构函数介绍

    python 有一个相应的特殊解构器(destructor)方法名为__del__().然而,由于python具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会被执行.python中的解构器是在实例释放前提供特殊处理功能方法,它们通常没有被实现,因为实例很少被显式释放. 在下面的例子中,我们分别创建(并覆盖) __init__()和__del__()构造器及解构函数,然后,初始化类并给同样的对象很多别名.id()内建函数可用来确定引用同一对象的三个别名.最后一

  • 关于ES6中的箭头函数超详细梳理

    目录 一.箭头函数的介绍 1.1 什么是箭头函数 1.2 基本语法 1.3 箭头函数的参数 1.4 箭头函数的函数体 二.箭头函数的this指向规则 三.箭头函数的arguments规则 3.1 箭头函数没有自己的arguments 3.2 可以用rest替代,rest参数获取函数的多余参数 3.3 箭头函数不支持重复函数参数的名称 3.4 箭头函数不能用作Generator,不能使用yeild关键字 四.箭头函数的注意事项 五.箭头函数不适用场景 六.箭头函数与普通函数简单区别总结 一.箭头函

  • C++超详细讲解构造函数与析构函数的用法及实现

    目录 写在前面 构造函数和析构函数 语法 作用 代码实现 两大分类方式 三种调用方式 括号法 显示法 隐式转换法 正确调用拷贝构造函数 正常调用 值传递的方式给函数参数传值 值传递方式返回局部对象 构造函数的调用规则 总结 写在前面 上一节解决了类与对象封装的问题,这一节就是对象的初始化和清理的构造函数与析构函数的内容了:对象的初始化和清理也是两个非常重要的安全问题:一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题:c++利用了构

随机推荐