对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
1、构造函数:
构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存。构造函数的命名必须和类名完全相同,构造函数可以被重载,可以多个,可以带参数。
  eg:

  class A
  {
  public:
  A(){cout<<"无参构造函数";}
  A(int i){cout<<"带参构造函数";}
  };
  A();//调用默认构造函数
  A(1);//调用有参构造函数
  创建一个对象就会调用无参构造函数,也就是默认构造函数,有参的构造函数需要自己调用。
2、析构函数
构造函数可以重载,析构函数不能重载,析构函数永远只有一个,如果没写析构函数,c++会自动帮我们写一个析构函数。
构造函数和析构函数是一对,构造函数用来创建对象,而析构函数是用来撤销对象。
eg:

#include <iostream>
using namespace std; class A
{
public:
A()
{
cout<<"构造函数被调用了!"<<endl;
}
~A(){cout<<"析构函数被调用了"<<endl;}
}; int main()
{
A a;//调用构造函数和析构函数
A *p=new A;//调用构造函数
delete p;//调用析构函数
return ;
}

3、拷贝构造函数

c++拷贝构造函数(深拷贝、浅拷贝)
4、赋值函数
当一个类的对象向该类的另一个对象赋值的时候,就会用到该函数。
当没有重载赋值函数,通过默认的赋值函数进行赋值操作。
eg:

#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"调用构造函数"<<endl;}
A(char s){cout<<s<<"调用构造函数"<<endl;}
~A(){cout<<"调用析构函数"<<endl;}
}; int main()
{
A a('a');
A b('b');
b=a;//a,b实际存在,再调用赋值函数,将a赋值给b
A c(a);//拷贝构造函数
return ;
}

拷贝函数和赋值函数的差别:
1、拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象进行赋值操作。
2、一般来说在数据成员包含指针对象的时候,需要考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。拷贝构造函数大多数情况下是复制,而赋值函数是引用函数。
3、实现不一样。拷贝构造函数首先是一个构造函数,它调用的时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。

#include <iostream>

using namespace std;
class A
{
public:
A(){cout<<"调用构造函数"<<endl;}
A(char s){cout<<s<<"调用构造函数"<<endl;}
A(const A &other);
A & operator = (const A &a);//重载拷贝函数
~A(){cout<<"调用析构函数"<<endl;}
};
A& A::operator =(const A &a)
{
A example;
cout<<"调用拷贝函数"<<endl;
return example;
} int main()
{
A a('a');
A b('b');
b=a;//a,b实际存在,再调用赋值函数,将a赋值给b
return ;
}

总结:

对象不存在,且用别的对象来初始化,就是调用了构造函数
对象不存在,且用别的对象来初始化,就是拷贝构造函数
对象存在,用别的对象来给它赋值,就是赋值函数
程序结束,每个对象都会调用析构函数

参考地址:https://blog.csdn.net/zcyzsy/article/details/52132936

C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转的更多相关文章

  1. c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

    每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...

  2. CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

    类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...

  3. c++ 构造函数,拷贝构造函数,析构函数与赋值操作符

    题目: 为下面的Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数. class Shape { int no; }; class Point { int x; int y; }; ...

  4. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  5. C++中的构造函数,拷贝构造函数,赋值函数

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  6. C++中的构造函数,拷贝构造函数和赋值运算

    关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...

  7. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html   类string的构造函数.拷贝构造 ...

  8. 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数

    一.题目: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &othe ...

  9. C++构造函数和拷贝构造函数详解

    构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含 ...

  10. C++ 构造函数、拷贝构造函数、赋值运算符

    <C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...

随机推荐

  1. CVO实现过程

    module vid_cvo #( , , , , , )( input clk, input rst_p, :] idata, input ivalid, input vid_sop, input ...

  2. 关于TM影像各波段组合的简介

    321:真彩色合成,即3.2.1波段分别赋予红.绿.蓝色,则获得自然彩色合成图像,图像的色彩与原地区或景物的实际色彩一致,适合于非遥感应用专业人员使用. 432:标准假彩色合成,即4.3.2波段分别赋 ...

  3. 从点到面,给Button的属性动画

    属性动画是API 11加进来的一个新特性,其实在现在来说也没什么新的了.属性动画可以对任意view的属性做动画,实现动画的原理就是在给定的时间内把属性从一个值变为另一个值.因此可以说属性动画什么都可以 ...

  4. Swift: 用Alamofire做http请求,用ObjectMapper解析JSON

    跟不上时代的人突然间走在了时代的前列,果然有别样的风景.首先鄙视一下AFNetworking.这个东西实在太难用了.不想封装都不行,要不写一大堆代码. NSURL *URL = [NSURL URLW ...

  5. (转)C# 中使用分布式缓存系统Memcached

    转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...

  6. NLP生成论文

    论文框架 内容 注:既要有引用,又不能完全引用,是在前人基础上更进一步.

  7. 3、利用GDB进行程序调试

    本文将用一个实际例子讲解如何通过GDB进行程序调试. 首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么 ...

  8. hdu 3915 高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=3915 这道题目是和博弈论挂钩的高斯消元.本题涉及的博弈是nim博弈,结论是:当先手处于奇异局势时(几堆石子数相互 ...

  9. Scala_函数式编程基础

    函数式编程基础 函数定义和高阶函数 函数字面量 字面量包括整数字面量.浮点数字面量.布尔型字面量.字符字面 量.字符串字面量.符号字面量.函数字面量和元组字面量. scala> val i = ...

  10. 7.与python交互

    与python交互 在熟练使用sql语句的基础上,开始使用python语言提供的模块与mysql进行交互 这是我们在工作中大事要做的事 先学会sql是基础,一定要熟练编写sql语句 安装引入模块 安装 ...