C++之构造函数、参数列表、析构函数

参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485

  • 构造函数之默认构造函数(调用的构造函数不用传递参数)
Student stul(); Student *p = NULL; p = new Student();
Student Student(string name =
两种实例化方式都是默认构造函数
  • 构造函数之初始化列表
红字部分即为初始化列表:一个引号,多个参数用逗号隔开,赋值用()
 
初始化列表特性:
  1. 其先于构造函数执行
  2. 其只能用于构造函数
  3. 其可以同时初始化多个数据成员
  • 【注意】初始化列表的功用:对于类中的静态常量,不能用构造函数来初始化,必须使用初始化列表的方式
  • 拷贝构造函数
计算机生成了可选文字: class Student public: Student(){m_strName = jim ; } Student(const Student& Stu){ } private: Stri n g m_strName;
     拷贝构造函数的特点:
    1. 当用户没有定义构造函数时,编译器会自动生成一个默认的拷贝构造函数(构造函数也是如此)
    2. 当采用直接初始化或复制初始化实例化对象时,系统会自动调用拷贝构造函数
    3. 由于拷贝构造函数的特性,拷贝构造函数不能重载!!
  • 【总结】构造函数总结:
    无 参 构 造 函 数 一 默 认 构 造 函 数 构 造 函 数 参 数 带 默 认 值 有 参 构 造 函 数 参 数 无 默 认 值
  • 【总结】所有参数带有默认值时,转变成了默认构造函数普 通 构 造 函 数 系 统 自 动 生 成 的 函 数 拷 贝 构 造 函 数 普 通 构 造 函 数 初 始 化 列 表 拷 贝 构 造 函 数
【注意】初始化列表是所有构造函数都可以实现的.
  • 析构函数(用于释放系统资源的函数)
    定义格式:
    class Student public: Student() { cout < < —Student() { cout < < private: string m_strName;

    析构函数特点:
    • 如果没有自定义的析构函数,则系统自动生成
    • 析构函数在对象销毁时自动调用(与之相对应,构造函数在对象实例化时自动调用)
    • 析构函数没有返回值(构造函数也是如此)、没有参数也不能重载
    • 不允许在()内加任何的参数
  • 【重要知识点】对象的生命历程
申 请 内 存 初 始 化 列 表 构 造 函 数 释 放 内 存 与 析 构 函 数
    • 【总结】成员函数的分类
      成 员 函 数 特 殊 函 数 属 性 封 装 函 数 构 造 函 数 一 般 功 能 函 数 析 构 函 数 拷 贝 构 造 函 数 默 认 构 造 函 数
      成员函数的参数修饰方式
      引 用 参 数 默 认 值 成 员 函 数 const 函 数 重 载
      对象实例化的方式
      引 用 对 象 实 例 化 const 堆 中 实 例 化 栈 中 实 例 化
      定义一个函数只要不是函数声明,就要记着写{},即使{}不写任何的语句。

 

总结:构造函数与析构函数的调用顺序

1、先执行 被组合对象的构造函数

(1)当类中有成员变量是其他类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后调用自身类的构造函数。

(2)析构函数的调用顺序与对应的构造函数调用顺序相反。

2、被组合对象的构造顺序,预定义顺序有关系,与初始化列表的顺序没有关系

3、 特殊成员变量必须用参数列表初始化。const、&、对象

4、static类型的成员变量,必须在类外初始化,且不带static关键字。

 

 

注意:构造函数中不要调用构造函数!!这是一种危险的行为!(匿名对象深究)

#include<iostream>
#include<string>
using namespace std;
class Point {
public:
    Point(int a,int b,int c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
        cout << "这是Pointd的有3个默认参数的构造函数!  "<<this->a<<" "<<this->b<<" "<<this->c<<endl;
    }

    Point(int a, int b)
    {
        this-> a= a;
        this->b = b;
        Point(3, 4, 5);//产生一个匿名对象,纸条语句执行结束,匿名对象会被析构。
        cout << "这是Pointd的有2个默认参数的构造函数!  " << this->a << " " << this->b << endl;
    }
    ~Point()
    {
        cout << "Point对象被析构了! "<<this->a << " " << this->b << " " << this->c << endl;
    }

    int getC()
    {
        return c;
    }
private:
    int a;
    int b;
    int c;

};


int run()
{
    Point aa(1, 2);
    cout << aa.getC() << endl;  //c的值为垃圾值,因为匿名对象被创建有立即析构了  
//就算用不析构的方式,也是垃圾值,因为c是不同对象中的元素     
                   
//在2个参数的构造函数中,没有显式初始化c,不能通过构造其他对象而在本构造对象中访问未初始化的数据 return 0; } int main() { run(); cout << "hello world!\n"; return 0; }

 

转载于:https://www.cnblogs.com/cthon/p/9175514.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值