C++基础知识梳理--C++的6个默认函数
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个默认函数的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- Anliven - 基础知识梳理汇总 - 软件测试
基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
- C#基础知识梳理索引
C#基础知识梳理索引 一 引子 之前曾写了一篇随笔<.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标> 三个月过去了,目标使更多的编程初学者,轻松高效地掌握C#开发的基础,重 ...
随机推荐
- PC/SC
简介 PC/SC规范由微软公司与世界其它著名的智能卡厂商组成的PC/SC工作组提出的.PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal C ...
- 奇怪的haproxy 跳转
<pre name="code" class="html">奇怪的Haproxy 跳转: acl admin_req path_beg -i /ad ...
- libvirt python binding 变成了一个新项目了。
http://libvirt.org/git/ $ git clone git://libvirt.org/libvirt-python.git 2013年的事情了. $ git show a7a12 ...
- 在mac上访问自带服务器权限问题
在开发中,有时候我们需要自己的在电脑上做一些网络相关的测试功能,因此,我们必须在本地上模拟网络环境. 在模拟网络环境中,经常会遇到访问权限的问题.现在我就把自己的解决办法写出来.我用的模拟服务器站点是 ...
- Java Dom解析xml
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,下面结合这个xml文件来进行dom解析. <?xml version="1.0&q ...
- SlidingMenu的编译及使用
1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,ExampleListActivity项目会报错: No resource found that ...
- html基础标签-2-textarea文本域
textarea文本域 <!doctype html> <html lang='zh-cn'> <head> <meta charset='utf-8'> ...
- English - according to 的用法说明
1. 用于according to,意为“根据”,为复合介词,后接名词或代词.注意以下用法: (1) 主要用来表示“根据”某学说.某书刊.某文件.某人所说等或表示“按照”某法律.某规定.某惯例.某情况 ...
- 表A中有两个表示时间的字段A,B;如果B的值大于A的值,则把B的值更新为A的值
sql语句:表A中有两个表示时间的字段A,B:如果B的值大于A的值,则把B的值更新为A的值 update 表名 set B=A where B>A
- Apache与Nginx优缺点比较
本文来源:收集.整理自互联网 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache ...