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

  • 构造函数之默认构造函数(调用的构造函数不用传递参数)
两种实例化方式都是默认构造函数
  • 构造函数之初始化列表
红字部分即为初始化列表:一个引号,多个参数用逗号隔开,赋值用()
 
初始化列表特性:
  1. 其先于构造函数执行
  2. 其只能用于构造函数
  3. 其可以同时初始化多个数据成员
  • 【注意】初始化列表的功用:对于类中的静态常量,不能用构造函数来初始化,必须使用初始化列表的方式
  • 拷贝构造函数
     拷贝构造函数的特点:
    1. 当用户没有定义构造函数时,编译器会自动生成一个默认的拷贝构造函数(构造函数也是如此)
    2. 当采用直接初始化或复制初始化实例化对象时,系统会自动调用拷贝构造函数
    3. 由于拷贝构造函数的特性,拷贝构造函数不能重载!!
  • 【总结】构造函数总结:
  • 【总结】所有参数带有默认值时,转变成了默认构造函数

【注意】初始化列表是所有构造函数都可以实现的.

  • 析构函数(用于释放系统资源的函数)
    定义格式:

    析构函数特点:

    • 如果没有自定义的析构函数,则系统自动生成
    • 析构函数在对象销毁时自动调用(与之相对应,构造函数在对象实例化时自动调用)
    • 析构函数没有返回值(构造函数也是如此)、没有参数也不能重载
    • 不允许在()内加任何的参数
  • 【重要知识点】对象的生命历程
    • 【总结】成员函数的分类

      成员函数的参数修饰方式

      对象实例化的方式

      定义一个函数只要不是函数声明,就要记着写{},即使{}不写任何的语句。

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

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(, , );//产生一个匿名对象,纸条语句执行结束,匿名对象会被析构。
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(, );
cout << aa.getC() << endl; //c的值为垃圾值,因为匿名对象被创建有立即析构了
//就算用不析构的方式,也是垃圾值,因为c是不同对象中的元素     
                   //在2个参数的构造函数中,没有显式初始化c,不能通过构造其他对象而在本构造对象中访问未初始化的数据
return ;
}
int main()
{ run();
cout << "hello world!\n";
return ;
}

C++之构造函数、参数列表、析构函数的更多相关文章

  1. 将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

    public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// < ...

  2. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  3. Qt中新建类构造函数的初始化参数列表

    使用Qt-creator自动生成一个窗体应用程序时会自动创建一个新的类,我的程序中名为MyDialog,类的定义为: #ifndef MYDIALOG_H #define MYDIALOG_H #in ...

  4. C++中为什么构造函数初始化列表

    已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢? 在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况:二,需要初始化const修饰的类成员:三,需要初始化引用成员 ...

  5. 代码坏味道特别篇————Long parameter List 过长的参数列表

    刚开始学习编程时,老师说:讲方法所需要的东西都以参数的形式传入,那是我们好像还没学OO这个东东,要不就弄成全局变量,我擦,全局变量可牛逼了,刚开始学习的时候我们都在用全局变量,可是后来工作了,经理说不 ...

  6. (63)Wangdao.com第十天_预处理、预解析_函数 上下文对象、参数列表对象

    预解析.预处理 1. 在全局代码执行之前,js 引擎 就会创建一个栈来存储管理所有的 执行上下文对象 2. 在 全局执行上下文 window 确定以后,进行压栈 3. 在 函数执行上下文对象 确定以后 ...

  7. C++构造函数初始化列表与构造函数中的赋值的区别

    C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int wei ...

  8. C++中的初始化参数列表

    c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中 1.const常量 class AA { public : const int num; public : AA() ...

  9. 在Python中使用可变长参数列表

    函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...

随机推荐

  1. python正则方法

    通过正则替换字符串 res=re.sub(正则,newString,srcString)//返回替换后的字符串 res,m=res.subn(正则,newString,srcString)//返回替换 ...

  2. PHP几种抓取网络数据的常见方法

    //本小节的名称为 fsockopen,curl与file_get_contents,具体是探讨这三种方式进行网络数据输入输出的一些汇总.关于 fsockopen 前面已经谈了不少,下面开始转入其它. ...

  3. 怎样在C语言里实现“面向对象编程”

    有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...

  4. Apache Server与多个独立Tomcat集成

    取经自http://www.ramkitech.com/2012/03/virtual-host-apache-httpd-server-tomcat.html 继续干Tomcat和Apache Se ...

  5. Finder 快捷键

    记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...

  6. hdu5317 RGCDQ 统计

    // hdu5317 RGCDQ // // 题目大意: // // 给定一个闭区间[l,r],定义f(x)是x的不同的质因子的个数 // 比方: 12 = 2 * 2 * 3,是两种.所以f(x) ...

  7. cookie、session及实现记住密码,自动登录

    在登录帐号.密码框下,有三种帐号登录模式可供选择,用户可根据自己的具体情况选择其中一种适合自己的模式. 1.网吧模式:勾选网吧模式后,登录的帐号会在歪歪注销/退出的时候自动清除,不会留在登录框中,可以 ...

  8. Android-运行时权限

    由于拨打电话数据用户的隐私,再者由于在5.0之后Android更注重于用户的隐私权限,为此出现了在低版本没有的问题,而在高版本出现的个别问题! Intent intent = new Intent(I ...

  9. JavaScript全讲-必知的特性

    上篇讲完JS面向对象的特性,我们今天就来聊聊它的其它特性. JS面向对象的特性较为隐晦,真正使用也是比較少的.而今天我们要讲的,却是在实际开发中常常遇到的特性. 1. 函数式编程 多数人并不知道&qu ...

  10. 我在开发第一个Swift App过程中学到的四件事

    本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/ 译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Sw ...