注:若类中没有显示的写如下函数,编译会自动生成:默认复制构造函数、默认赋值构造函数(浅拷贝)、默认=运算符重载函数(浅拷贝)、析构函数;

1、默认构造函数(默认值)构造函数的作用:初始化对象的数据成员。

2、复制构造函数  作用:用已存在的对象初始化新建的对象的数据成员。

类对象作为形参,如果参数是引用传递则不会调用任何复制构造函数;如果是按值传递,则会调用复制构造函数

3、=运算符重载

两个对象已存在;

4、深拷贝

为类的指针成员变量重新分配内存;

5、浅拷贝(编译器默认生成的复制构造函数为浅拷贝函数)

6、析构函数

用于完成对象删除前的清理工作。  

#include "stdafx.h"
#include "string"
#include <iostream> using namespace std;
class Person
{
public:
int nAge; //年龄
double dbHeight; //身高
//char *name; //姓名
public:
//1、默认构造函数(无参)
/*
1、如果创建一个类没有任何构造函数,则系统会自动生成一个默认的无参构造函数,函数体为空;
2、如果存在一个构造函数,系统就不会生成一个默认的构造函数,如果希望有一个无参的构造函数,则需要手动添加。
3、只允许有一个默认构造函数
*/
Person()
{
nAge = ;
dbHeight = ;
//name = new char[100];
}
//2、默认构造函数(浅拷贝函数)(所有参数为默认值的函数也为默认构造函数)
/*Person(int nAge = 16, double dbHeight = 175)
{
this->nAge = nAge;
this->dbHeight = dbHeight;
}*/
//3、复制构造函数(也称为拷贝构造函数)(等号右边类对象的值已被创建)
/*
1、复制构造函数参数为类对象本身的引用,根据已存在的对象复制出一个新的该类的对象,通常在函数中将已存在对象的数据成员的值复制一份到新创建的对象中;
2、类中若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统创建的该默认构造函数会有风险(深拷贝和浅拷贝);
*/
//4、=运算符重载(等号左右两边类对象的值都已被创建)
/*
1、将等号右边类对象的值,复制给等号左边类对象;
*/
Person &operator=(const Person &p)
{
//检查左右两边是否是否为同一对象,相同则直接返回
if (this == &p)
{
return *this;
}
//复制等号右边的成员到左边的对象中
this->nAge = p.nAge;
this->dbHeight = p.dbHeight; return *this;
} Person(const Person & p)
{
nAge = p.nAge;
dbHeight = p.dbHeight;
}
void showAge(Person p) //按值传递
{
cout <<"年龄:"<<p.nAge<<endl;
}
void showHeight(Person &p) //按引用传递
{
cout <<"身高:"<<p.dbHeight<<endl;
}
void showAgeHeight(Person *p) //按指针传递
{
cout <<"年龄:"<<p->nAge<<endl;
cout <<"身高:"<<p->dbHeight<<endl;
}
//析构函数
/*~Person()
{
delete name;
}*/
}; int _tmain(int argc, _TCHAR* argv[])
{
Person p1,p2; //调用无参构造函数
//Person p3 =p2; //调用复制构造函数
//p1.showAge(p1); //调用复制构造函数(不会调用无参构造函数)
//p1.showHeight(p1); //引用传递不会调用复制构造函数
//p1 = p2; //调用=运算符重载函数
//p1.showAgeHeight(&p1); //指针传递不会调用复制构造函数
return ;
}
 

C++构造函数(复制构造函数)、析构函数的更多相关文章

  1. 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)

    注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...

  2. C++ 复制控制之复制构造函数

    7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...

  3. C++学习基础六——复制构造函数和赋值操作符

    1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作 ...

  4. C++中复制构造函数

    复制构造函数 复制构造函数用于: 根据另一个同类型的对象显示或隐式初始化一个对象 复制一个对象,将它作为实参传给一个函数 从函数返回时复制一个对象 初始化顺序容器中的元素 根据元素初始化式列表初始化数 ...

  5. c++类与对象(1)——构造,复制构造函数

    CPP的类与对象: 当我们定义一个基本类型变量时,方法如下: int p; #定义一个int类型变量 bool b; #定义一个bool类型变量 float c ; #定义一个float类型变量 显然 ...

  6. 何时调用C++复制构造函数和拷贝构造函数(转)

    1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,它用于初始化过程中,而不是常规的赋值过程中.类的复制构造函数原型通常如下: class_name(const cl ...

  7. C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用

    一. 构造函数是干什么的   class Counter   {   public:            // 类Counter的构造函数            // 特点:以类名作为函数名,无返回 ...

  8. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...

  9. 赋值操作符、复制构造函数、析构函数、static成员练习

    /** * 定义一个Employee类,包含雇员名字和一个唯一的雇员标识,为该类定义默认构造函数和参数为表示 * 雇员名字的string构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * ...

随机推荐

  1. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  2. 枚举与#define 宏的区别

    1),#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值.2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量.3),枚举可以一次定义大量相关的常量,而#defi ...

  3. python __builtins__ license类 (41)

    41.'license', 许可证,执照 class _Printer(builtins.object) | interactive prompt objects for printing the l ...

  4. [AHOI2005]病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  5. 洛谷 P3312 [SDOI2014]数表

    式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...

  6. stack(单调栈) POJ 2082 Terrible Sets

    题目传送门 题意:紧贴x轴有一些挨着的矩形,给出每个矩形的长宽,问能组成的最大矩形面积为多少 分析:用堆栈来维护高度递增的矩形,遇到高度小的,弹出顶部矩形直到符合递增,顺便计算矩形面积,且将弹出的宽度 ...

  7. Win7系统出现提示: “Windows已遇到关键问题,将在一分钟后自动重新启动。”

    1. 若用户在使用Win7系统时,遇到上述系统故障,建议重启电脑.等电脑开机自检一过,马上按键盘上的F8键,选择进入安全模式.在安全模式下,进行系统还原.其他的解决方法见下. 1.或者,在安全模式下, ...

  8. Unity项目学习笔记

    1.TCP和IP IP:主要作用是在复杂的网络环境中将数据包发送给的最终的目标地址. 端口号:系统会分给系统端口号  一般知名的端口号在0-1023之间,而我们经常使用的自定义/动态分配的端口号则一般 ...

  9. Bootstrap中的datetimepicker浅谈

    从古至今,人们都习惯用某个时间来标记某个事件的发生.我们在写管理后台的时候,重中之中也是这个时间的设置.在问题出现的时候,我们是查看日志的时候,就可以根据这个时间段来查找这个问题出现点. 在使用时间控 ...

  10. Thymeleaf 总结

    在javaScript中使用表达式 var list = /*[[${list}]]*/ null;   <script th:inline="javascript"> ...