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构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * ...
随机推荐
- Docker容器日志管理最佳实践
目录 一 .Docker 引擎日志 二.容器日志 2.1.常用查看日志命令--docker logs 2.2 .Docker 日志 驱动 三. 生产环境中该如何储存容器中的日志 一.当是完全是标准输出 ...
- 关于 GraPhlAn 的孤独自学
最近需要用 GraPhlan 来绘制 taxo分类图,稍微研究了一下 一.简介 官网: http://huttenhower.sph.harvard.edu/GraPhlAn 主要有两个脚本: gra ...
- poj 2960 S-Nim【SG函数】
预处理出SG函数,然后像普通nim一样做即可 #include<iostream> #include<cstdio> using namespace std; const in ...
- 如何使用webstorm去操作git
0. 前言 在上一篇文章中,讲述了使用webstorm去调试node程序,最近研究了一下如何使用webstorm去操作git. 对于git的使用,大家的使用方式均有不同,最王道的方式非命令行莫属,基于 ...
- javascript E5面向对象和 E6面向对象
javascript es6之前的面向对象方法: 一般使用构造函数来实现 function Person (name, age) { this.name = name; this.age = age; ...
- Docker部署Tomcat,Nginx,Redis应用
一.tomcat部署 1.拉取tomcat镜像 docker pull tomcat:7-jre7 2创建tomcat容器 创建容器用于部署单点登录系统(CAS) -p表示地址映射 docker r ...
- A. Banana (2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛)
题目大意是有一堆猴子,然后每个猴子都有自己喜欢的香蕉类型,然后香蕉会在指定的位置,问每个猴子能不能在每个地方吃到自己喜欢的香蕉. 其实直接暴力即可(因为最大最大最大是50) 上代码: #include ...
- 跟我一起玩Win32开发(7):多边形窗口
通常情况下,窗口都是一个矩形,不过,调用下面这个函数,可以自定义窗口的形状. int SetWindowRgn( __in HWND hWnd, __in HRGN hRgn, __in BOO ...
- 移动端rem.js的使用方法
下面的代码一是我根据rem的使用经验,自己写的一个rem.js,发现很好用,能适用所有移动端h5页面的自适应需求: 代码一: window.onload = function(){ /*720代表设计 ...
- Adding New Machine ZOJ - 3540
https://vjudge.net/problem/ZOJ-3540 错误记录: 扫描线没有考虑到同一行的要删除在前,加入在后:由于用了特殊的方式所以想当然以为不需要考虑这个问题 #include& ...