• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++构造函数初始化顺序详解

C++构造函数初始化顺序详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++构造函数初始化,c++构造函数,c++拷贝构造函数,c++复制构造函数,c++继承构造函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.构造函数、析构函数与拷贝构造函数介绍

构造函数

1.构造函数不能有返回值
2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空
3.创建一个对象时,系统自动调用构造函数

析构函数

1.析构函数没有参数,也没有返回值。不能重载,也就是说,一个类中只可能定义一个析构函数
2.如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做
3.调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被自动调用;2.用new运算符动态构建的对象,在使用delete运算符释放它时。

拷贝构造函数

拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同。拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。它在三种情况下被调用:

1.用类的一个已知的对象去初始化该类的另一个对象时;
2.函数的形参是类的对象,调用函数进行形参和实参的结合时;
3.函数的返回值是类的对象,函数执行完返回调用者。

【代码】

/*
version: 1.0
author: hellogiser
date: 2014/9/25
*/

#include "stdafx.h"
#include <iostream>
using namespace std;

class point
{
private:
    int x, y;
public:
    point(int xx = 0, int yy = 0)
    {
        x = xx;
        y = yy;
        cout << "Constructor" << endl;
    }
    point(const point &p)
    {
        x = p.x;
        y = p.y;
        cout << "Copy Constructor" << endl;
    }
    ~point()
    {
        cout << "Destructor" << endl;
    }
    int get_x()
    {
        return x;
    }
    int get_y()
    {
        return y;
    }
};


void f(point p)
{
    // copy constructor
    cout << p.get_x() << "  " << p.get_y() << endl;
    // destructor
}

point g()
{
    point a(7, 33); //constructor
    return a; // copy constructor    temp object
}

void test()
{
    point a(15, 22); // constructor
    point b(a); //(1) copy constructor
    cout << b.get_x() << "  " << b.get_y() << endl; // 15 22
    f(b);//  (2) copy constructor
    b = g(); // (3) copy constructor
    cout << b.get_x() << "  " << b.get_y() << endl; // 7  33
}

int main()
{
    test();
    return 0;
}
/*
Constructor
Copy Constructor
15      22
Copy Constructor
15      22
Destructor
Constructor
Copy Constructor
Destructor
Destructor
7       33
Destructor
Destructor
*/
</div>

2. 继承关系中构造函数执行顺序

(1)任何虚拟基类(virtual)的构造函数按照它们被继承的顺序构造;
(2)任何非虚拟基类(non-virtual)的构造函数按照它们被继承的顺序构造;
(3)任何成员对象(data member)的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数(self)。

【代码】
/*
version: 1.0
author: hellogiser
date: 2014/9/27
*/

#include "stdafx.h"
#include <iostream>
using namespace std;


class OBJ1
{
public:
    OBJ1()
    {
        cout << "OBJ1\n";
    }
};

class OBJ2
{
public:
    OBJ2()
    {
        cout << "OBJ2\n";
    }
};

class Base1
{
public:
    Base1()
    {
        cout << "Base1\n";
    }
};

class Base2
{
public:
    Base2()
    {
        cout << "Base2\n";
    }
};

class Base3
{
public:
    Base3()
    {
        cout << "Base3\n";
    }
};

class Base4
{
public:
    Base4()
    {
        cout << "Base4\n";
    }
};

class Derived : public Base1, virtual public Base2,
    public Base3, virtual public Base4
{
public:
    Derived() : Base4(), Base3(), Base2(),
        Base1(), obj2(), obj1()
    {
        cout << "Derived.\n";
    }
protected:
    OBJ1 obj1;
    OBJ2 obj2;
};

void test()
{
    Derived aa;
    cout << "This is ok.\n";
}

int main()
{
    test();
    return 0;
}
/*
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived.
This is ok.
*/
</div>

【代码2】
/*
version: 1.0
author: hellogiser
date: 2014/9/27
*/

#include "stdafx.h"
#include <iostream>
using namespace std;

class Base1
{
public:
    Base1(int i)
    {
        cout << "Base1 " << i << endl;
    }
};

class Base2
{
public:
    Base2(int i)
    {
        cout << "Base2 " << i << endl;
    }
};

class Bas

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 构造函数中使用new时注意事项
  • C++ 赋值构造函数注意点介绍
  • 关于C++中构造函数初始化成员列表的总结
  • C++ 初始化列表详解及实例代码
  • c++ 构造函数中调用虚函数的实现方法
  • 关于C++类的成员初始化列表的相关问题
  • 解析C++中构造函数的默认参数和构造函数的重载
  • C++中结构体的类型定义和初始化以及变量引用
  • C++中构造函数重载
  • C++中COM组件初始化方法实例分析

相关文章

  • 2017-05-28C++并查集亲戚(Relations)算法实例
  • 2017-05-28深入解析C++中的字符数组和处理字符串的方法
  • 2017-05-28详谈C++的内存泄漏问题
  • 2017-05-28C语言typedef与复杂函数声明问题的深入解析
  • 2017-05-28浅谈C++指针(必看)
  • 2017-05-28C++ clock()解析如何使用时钟计时的应用
  • 2017-05-28全局变量与局部变量在内存中的区别详细解析
  • 2017-05-28ShellExecute函数用法的实例代码
  • 2017-05-28指向变量的常指针与指向常变量的指针详细解析
  • 2017-05-28C++实现自顶向下的归并排序算法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈c++ vector和map的遍历和删除对象
    • C 语言简单加减乘除运算
    • 基于Windows C++ 应用程序通用日志组件的使用详解
    • 详解设计模式中的Command命令模式及相关C++实现
    • 6个变态的C语言Hello World程序
    • 浅析stl序列容器(map和set)的仿函数排序
    • 对C语言中指针的理解与其基础使用实例
    • c++ 判断奇数偶数实例介绍
    • C语言实现用户态线程库案例
    • C++设计模式之享元模式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有