//类的构造函数使用规则
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std; class PointA{ }; class PointB{
public:
PointB(int _a, int _b, const char *pin/*in*/){
x = _a;
y = _b;
remark = (char *)malloc(sizeof(char)*(strlen(pin) + ));
strcpy(remark, pin);
cout << "我是自定义的有参构造函数4" << endl;
}
private:
int x;
int y;
char *remark;
}; class PointC{
public:
PointC(PointC &pm){
cout << "我是自定义的拷贝构造函数3" << endl;
//修改拷贝构造函数
x = pm.x;
y = pm.y;
//remark = pm.remark; 这句话错误
//修改后的方案
remark = (char *)malloc(sizeof(char)*(strlen(pm.remark) + ));
strcpy(remark, pm.remark);
}
private:
int x;
int y;
char *remark;
}; void ProtectA(){
PointA p1;//调用默认无参构造函数
PointA p2=p1;//调用默认拷贝构造函数
//结论①:当类中没有定义任何一个构造函数时,c++编译器会提供无参构造函数和拷贝构造函数 //PointB p3; //报错: error C2512: “PointB”: 没有合适的默认构造函数可用
PointB p4(,,"");//调用自定义有参构造函数
PointB p5 = p4;//调用默认拷贝构造函数
//结论②:当类中定义了任意的非拷贝构造函数(无参,有参),c++编译器不会提供无参构造函数,
//但是如果类中也没有定义任意的拷贝函数,那么c++编译器还是会提供默认拷贝构造函数 //PointC p6; //报错 error C2512: “PointC”: 没有合适的默认构造函数可用
//结论③:当类中定义了拷贝函数时,c++编译器不会提供默认的无参构造函数 //结论④:默认拷贝构造函数只是类成员变量间的简单赋值(详情参考类的浅拷贝)
} void main(){ system("pause");
}

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

构造函数与析构函数的调用顺序

当类中有成员变量是其它类的对象时

首先调用成员变量的构造函数

调用顺序与声明顺序相同

之后调用自身类的构造函数

析构函数的调用顺序与对应的构造函数调用顺序相反

C++ 类的构造函数使用规则的更多相关文章

  1. C++学习17派生类的构造函数

    基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...

  2. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  3. 【C++学习之路】派生类的构造函数(一)

    一.简单派生类的构造函数 1.所谓简单派生类,就是指派生类中不包含基类的内嵌对象的派生类. 2.一般来说,这样的派生类的构造函数的形式是: student( int i, string nam, in ...

  4. c++ 派生类的构造函数 与 基类构造函数的关系

    <面向对象程序设计基础(第二版>李师贤等,第254页:C++语言的基本规则是:创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数. <T ...

  5. c++中的类(构造函数,析构函数的执行顺序)

    类对象的初始化顺序 新对象的生成经历初始化阶段(初始化列表显式或者隐式的完成<这部分有点像java里面的初始化块>)——> 构造函数体赋值两个阶段 1,类对象初始化的顺序(对于没有父 ...

  6. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  7. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  8. scala入门教程:scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...

  9. [转]c++类的构造函数详解

    c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...

随机推荐

  1. url: (6) Couldn’t resolve host ‘www.ttlsa.com’

    http://www.ttlsa.com/linux/curl-6-couldnt-resolve-host/ 2. 解决问题 尝试解决方法: 修改dns # cat /etc/resolv.conf ...

  2. 初识 NoSQL Databases RethinkDB

    初识 NoSQL Databases RethinkDB rethinkDB所有数据都是基于 json的Document; 官网:http://rethinkdb.com/ github: https ...

  3. 使用PyQt4 designer时无法启动uic解决方案

    1.自己调用命令行 pyuic4 -o codeFile.py -x yourUIfile.ui 2.写一个批处理,每次双击就行了,跟你的源文件放在同一文件夹下 import os for root, ...

  4. ServletConfig讲解

    1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <ser ...

  5. cocos2d-x 源代码分析 : EventDispatcher、EventListener、Event 源代码分析 (新触摸机制,新的NotificationCenter机制)

    源代码版本号来自3.x,转载请注明 cocos2d-x 源代码分析总文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结 ...

  6. C#指南,重温基础,展望远方!(9)C#接口

    接口定义了可由类和结构实现的协定. 接口可以包含方法.属性.事件和索引器. 接口不提供所定义的成员的实现代码,仅指定必须由实现接口的类或结构提供的成员. 接口可以采用多重继承. 在以下示例中,接口 I ...

  7. MVC与MVP(转)

    MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成为.NET社区的热名话题.作为MVC的变种MVP模式,也已经出 ...

  8. JNI调用之本地库文件的安装

    在进行JNI调用的时候.是由java的本地接口调用本地库文件来完毕的,可是本地库文件须要放置到指定位置.JNI接口才干调用到,这个路径是由JVM的系统变量"java.library.path ...

  9. jquery 鼠标拖动排序Li或Table

    1.前端页面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="拖动排序Li或Ta ...

  10. java递归算法实现拼装树形JSON数据

    有时候页面需要使用jQuery easy ui中的combotree,需要给combotree提供一个JSON数据,使用如下方法(递归)实现(下面是dao层的实现层): /** * 根据表名和父id拼 ...