C++构造函数(复制构造函数)、析构函数
注:若类中没有显示的写如下函数,编译会自动生成:默认复制构造函数、默认赋值构造函数(浅拷贝)、默认=运算符重载函数(浅拷贝)、析构函数;
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++构造函数(复制构造函数)、析构函数的更多相关文章
- 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)
注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...
- C++ 复制控制之复制构造函数
7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...
- C++学习基础六——复制构造函数和赋值操作符
1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作 ...
- C++中复制构造函数
复制构造函数 复制构造函数用于: 根据另一个同类型的对象显示或隐式初始化一个对象 复制一个对象,将它作为实参传给一个函数 从函数返回时复制一个对象 初始化顺序容器中的元素 根据元素初始化式列表初始化数 ...
- c++类与对象(1)——构造,复制构造函数
CPP的类与对象: 当我们定义一个基本类型变量时,方法如下: int p; #定义一个int类型变量 bool b; #定义一个bool类型变量 float c ; #定义一个float类型变量 显然 ...
- 何时调用C++复制构造函数和拷贝构造函数(转)
1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,它用于初始化过程中,而不是常规的赋值过程中.类的复制构造函数原型通常如下: class_name(const cl ...
- C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用
一. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回 ...
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...
- 赋值操作符、复制构造函数、析构函数、static成员练习
/** * 定义一个Employee类,包含雇员名字和一个唯一的雇员标识,为该类定义默认构造函数和参数为表示 * 雇员名字的string构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * ...
随机推荐
- 一个C#文件传输模块,支持断点续传
一个C#文件传输模块,支持断点续传 最近做一个程序需要传送文件,在网上找了好久也没找到好用的方案,于是自己写了一个,与大家分享,希望大家帮忙改进,拍砖欢迎-文件采取分块发送,每块单独校验,能够保证文件 ...
- 插入符的创建(MFC)
int CDrawRectangleDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { ) ; // TODO: 在此添加您专用的创建代码 CreateSol ...
- sscanf非常的重要
刚进研究生阶段,发现曾经学习的c语言真的好少好少,很少能够看见scanf printf等..... 以后实验的80%以上都是在linux下面 老师让我看看关于一个日志会聚的一个项目模块 发现基本上都是 ...
- noip 2012 Day2 T2 借教室
一.暴力简述 甩链接.jpeg 首先我们不难看出,这道题————并不是一道多难的题,因为显然,第一眼看题目时便很容易地想到暴力如何打:枚举每一种订单,然后针对每一种订单,对区间内的每一天进行修改(做减 ...
- 分层图初探 By cellur925
因为最近测试遇到了分层图的题目,所以稍微学了一下==. 这种题目一般是来解决最短路边权有变化/有k条免费路的问题的.他们基本都一般有两种实现方式:dp+最短路/分层图+最短路 当然你如果非要说他们是一 ...
- 详解基于linux环境MySQL搭建与卸载
本篇文章将从实际操作的层面,讲解基于linux环境的mysql的搭建和卸载. 1 搭建mysql 1.1 官网下载mysql压缩包 下载压缩包时,可以先把安装包下载到本地,再上传到服务器,也可以在 ...
- redis的安装(图文详解)
我这里,搭建在 继续
- eclipse | 配置JRE
Window --> Preference --> Java ---> Installed JREs
- IOCP编程之基本原理
在我的博客之前写了很多关于IOCP的“行云流水”似的看了让人发狂的文章,尤其是几篇关于IOCP加线程池文章,更是让一些功力不够深厚的初学IOCP者,有种吐血的感觉.为了让大家能够立刻提升内力修为,并且 ...
- AtCoder Grand Contest 010 F - Tree Game
题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...