C++有六个默认函数:分别是

1、default构造函数;

2、默认拷贝构造函数;

3、默认析构函数;

4、赋值运算符;

5、取值运算符;

6、取值运算符const;

// 这两个类的效果相同

class Person
{} class Person
{
public:
Person() {...} // deafault构造函数;
Person(const Person&) {...} // 默认拷贝构造函数
~Person() {...} // 析构函数
Person& operator = (const Person &) {...} // 赋值运算符
Person *operator &() {...} // 取值运算符
const Person *operator &() const {...} // 取值运算符const
}

下面这个例子展现的是默认函数的调用方式;

例:

Person.h

#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string> using namespace std; class Person
{
public:
Person(); // deafault构造函数;
Person(const Person&); // 默认拷贝构造函数
~Person(); // 析构函数
Person& operator = (const Person &); // 赋值运算符
Person *operator &(); // 取值运算符
const Person *operator &() const; // 取值运算符const public:
string getName() { return sName; }
string getCode() { return sCode; } void setName(string name);
void setCode(string code); void printInfo();
private:
string sName;
string sCode;
}; #endif // PERSON_H
Person.cpp

#include "Person.h"

Person::Person()
{
cout << "运行:default构造函数;" << endl;
} Person::Person(const Person &src)
{
cout << "运行:copy构造函数;" << endl;
sName = src.sName;
sCode = src.sCode;
} Person::~Person()
{
cout << "运行:析构函数;" << endl;
} Person &Person::operator =(const Person &src)
{
cout << "运行:赋值运算符;" << endl;
sName = src.sName;
sCode = src.sCode;
return *this;
} Person *Person::operator &()
{
cout << "运行:取址运算符;" << endl;
return this;
} const Person *Person::operator &() const
{
cout << "运行:取址运算符const;" << endl;
return this;
} void Person::setName(string name)
{
sName = name;
} void Person::setCode(string code)
{
sCode = code;
} void Person::printInfo()
{
cout << "Name : " << sName << endl;
cout << "Code : " << sCode << endl << endl;
}
main.cpp

#include <iostream>

#include "Person.h"

using namespace std;

int main()
{
// 创建a
Person a;
a.setName("李明");
a.setCode(""); // 创建b
Person b(a);
b.setCode(""); // 创建c
Person c;
c = b;
c.setCode(""); // 创建d
Person *d;
d = &a;
d->setCode(""); // 输出
a.printInfo();
b.printInfo();
c.printInfo();
d->printInfo();
return ;
}

输出结果:

只声明一个空类而不去使用时,编译器会默认生成:

1、default构造函数;  2、默认拷贝构造函数;  3、默认析构函数;  4、赋值运算符;

构造函数:

构造函数用于创建对象,对象被创建时,编译系统对对象分配内存空间,并自动调用构造函数。

构造函数运行的过程是:

1、系统创建内存空间,调用构造函数;

2、初始变量表;

3、函数体部分运行;

copy构造函数:

构造函数的一种,在C++中,下面三种对象需要拷贝的情况,拷贝构造函数将会被调用。

1、 一个对象以值传递的方式传入函数体

2、 一个对象以值传递的方式从函数返回

3、 一个对象需要通过另外一个对象进行初始化

一般来说copy构造函数被重写是为了处理默认拷贝构造函数(bitwise copy)不能完成的情况;这些情况大多来自深拷贝和浅拷贝的区别;

析构函数:

在对象析构时被掉用,用于析构对象,释放内存;

赋值运算符:

赋值运算符存在的意义就是可以快速简单的用一个类对一个类进行赋值;从赋值这一点上来说同copy构造函数十分相似;可以将copy构造函数看作是构造函数和赋值运算符的组合。

注意的是:必须返回 *this,也就是做操作数的引用;

 如何禁用这些函数?

所有的默认函数都是public的并且是inline的;所以希望外界不能调用的话,就将这些函数申明成private类型,但是这回出现什么后果呢?

我只能说呵呵了,试试吧。

 

C++基础知识梳理--C++的6个默认函数的更多相关文章

  1. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  2. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  3. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  4. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

  5. [SQL] SQL 基础知识梳理(五) - 复杂查询

    SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...

  6. Anliven - 基础知识梳理汇总 - 软件测试

    基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...

  7. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  8. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  9. C#基础知识梳理索引

    C#基础知识梳理索引 一 引子 之前曾写了一篇随笔<.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标> 三个月过去了,目标使更多的编程初学者,轻松高效地掌握C#开发的基础,重 ...

随机推荐

  1. C++实现Http Post请求

    参考资料: http://apps.hi.baidu.com/share/detail/39003388 http://blog.csdn.net/yc0188/article/details/474 ...

  2. ubuntu 下编译内核

    目的: 1. 练习.网上有很多类似的文章可供参考. 2. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准备,所以写这个blog. 环境: ubuntu ...

  3. openstack core components use 总结

    1,附加volume(块存储,云硬盘)到vmInstances(虚拟机实列)

  4. JSP、JSTL、EL

    Jsp Jsp内置对象: Response.Request.Page.pageContext.session.out.application.exception.config Out->jspW ...

  5. hdu-5082

    题意非常easy,就是给出父母的名字,然后依据父母的名字来给孩纸取名字! 能够将此题简化为: 孩纸的名字=父亲的frist name+字符串(_small_)+母亲额frist name; 然后将孩纸 ...

  6. web开发 - 从零开始 - 03 - 选择器

    行间样式>id>class>类型选择>通配符 选择器的优先级一致的情况下,后边的样式会覆盖前边的

  7. SPFile上传文件到文档库

    , dataLen);            SPSite sps = SPControl.GetContextSite(Context);            sps.AllowUnsafeUpd ...

  8. win7 ie10输入网址显示无法显示此页问题的解决

    忽然又一天,非常奇怪,所有的浏览器都无法访问网页,直接输入IP也是不行. 本人试过各种方法,包括用360进行修复:清除%temp%下文件:看是否设错了dns, 升级和修复IE,重新注册ie相关的dll ...

  9. idea修改文件名后出现main method should be static错误

    1.确保你有main方法 2.别忘了main方法里还有参数: String[] args

  10. curl: (6) Couldn’t resolve host ‘www.ttlsa.com’

      上周, 部分站点出现Couldn't resolve host.....问题,  导致公司所有走api的程序都无法正常使用(系统redhat 6.3的都出现问题, redhat 5一切OK). 最 ...