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

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. java io流中怎么在一个文本中追加字符串

    1/ FileOutputStream(File file, boolean append)2/FileWriter(File file, boolean append) 不管哪一种IO都有 appe ...

  2. View Controller Programming Guide for iOS---(四)---Creating Custom Content View Controllers

    Creating Custom Content View Controllers 创建自定义内容视图控制器 Custom content view controllers are the heart ...

  3. bzoj 2648: SJY摆棋子【KD-tree】

    其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...

  4. 【Tip】Python

    『基本操作』 [查看Python所在目录] import os print(os.__file__) [查看已安装的包] pip list [获取当前脚本所在目录] import sys import ...

  5. hdu1811 Rank of Tetris 并查集+拓扑排序

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...

  6. C++ 的浅拷贝和深拷贝(结构体)

    关于浅拷贝和深拷贝这个问题遇上的次数不多,这次遇上整理一下,先说这样一个问题,关于浅拷贝的问题,先从最简单的说起. 假设存在一个结构体: struct Student { string name; i ...

  7. first-child和last-child选择器 nth-child(n)第几个元素 nth-last-child(n)倒数第几个元素

    :first-child 和  :last-child 分别表示父元素中第一个 或者  最后一个 子元素设置样式,如上图

  8. redis过期策略+事务+分布式锁+单redis服务器锁

    过期策略 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i ...

  9. UvalLive4670(AC自动机模板)

    放上刘汝佳的模板: #include <cstdio> #include <cstring> #include <string> #include <algo ...

  10. iOS UILabel UITextView自适应文本,或文本大小自适应

    //UILabel自适应文本的高度 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.numberOf ...