C++类的默认成员函数
成员函数隐含this指针参数:
每成员函数一个隐式的指针形参(构造函数除外);
对象在调用成员函数时,编译器会将对象的地址传递给this指针;
1、构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个)
Mystring(const char *str="")//带缺省值的构造函数
{
_str = new char[strlen(str) + ];
strcpy(_str, str);
}
2、拷贝构造函数(使用同类对象来初始化;构造函数的重载;若未显示定,系统会调缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化)
Mystring(const Mystring& s)
{
_str = new char[strlen(s._str) + ];
strcpy(_str, s._str);
}
Mystring s1;
拷贝构造函数的2种调用方式
Mystring s2(s1);
Mystring s3=s2;
但为什么拷贝构造函数传递的参数为引用呢?
使用传值传递会引发无穷递归调用,如上的调用方式,拷贝构造函数传入的参数为Mystring的一个实例s,由于是传值参数,所以会把形参s复制到实参s1又调用拷贝构造函数,所以会无穷的递归
3、析构函数(当一个对象的生命周期结束时,c++编译器会自动调用析构函数;负责做一些清理工作)
~Mystring()
{
if (_str)
delete[]_str;
}
4、赋值运算符的重载
Mystring& operator=(const Mystring& s)
{
if (this != &s)
{
char *tmp = new char[strlen(s._str) + ];
delete[] _str;
_str = tmp;
strcpy(_str, s._str);
}
return *this;
}
Mystring s4;
s4 = s1;
a、将返回值类型声明为该类型的引用,并在函数结束前返回实例自身的引用才能支持连续复制如(s1=s2=s3);?为什么
引用是左值(可以放在赋值运算符的左边),返回引用可以直接操作,也就可以进行连续赋值;所以s3将值复制给s2后,s2还能将值复制给s1
另外,引用作为返回值有以下几点:(使用值作为返回值会创建临时变量存储返回值,因为函数返回时局部变量会被释放必须用临时变量存储,指针也是如此,只不过临时变量里存 的时临时变量的地址。)
在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象;
不要返回局部对象的引用 ,当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。
b、将传入的参数申明为常量的引用,就不用调用拷贝构造函数以免不必要的消耗;
c、在分配新内存前释放自身已有的内存,以防内存泄露;
d、判断传入的参数和当前的实例(*this)是不是同一个实例,若为同一个实例时一旦释放内存,传入参数的内存也就被释放了,再也找不到需要复制的内容了。
C++类的默认成员函数的更多相关文章
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- C++默认成员函数
1.什么是面向对象? 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法. 对象指的是类的实例,将对象作为程序的基本单元,将程 ...
- C++中的默认成员函数
一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass: ...
- 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...
- 如何禁止C++默认成员函数
如何禁止C++默认成员函数 发表于 2016-03-02 | 分类于 C++ | 阅读次数 17 前言 前几天在一次笔试过程中被问到C++如何设计禁止调用默认构造函数,当时简单的想法是直 ...
- CDocument类的UpdateAllViews()成员函数
(一)UpdateAllViews() 与 Invalidate()的区别 UpdateAllViews()是在DOC/VIEW结构中,当一个视图的数据改变后,通知所有视图作相应的改变,和重画毫无关系 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
随机推荐
- luogu P5366 [SNOI2017]遗失的答案
luogu 首先gcd为\(G\),lcm为\(L\),有可能出现的数(指同时是\(G\)的因数以及是\(L\)的倍数)可以发现只有几百个.如果选出的数要能取到gcd,那么对于每种质因子,都要有一个数 ...
- TKmybatis和mybatisplus哪个好用
文档连接 :http://baomidou.oschina.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B https://gitee.com/hengboy ...
- Elasticsearch中文文档,内容不全
注意 内容不全,这是观看中文文档进行操作的 文档地址 旧版中文文档,部分内容过期 https://www.elastic.co/guide/cn/elasticsearch/guide/current ...
- 13、yum
1.yum yum是管理rpm包的工具 2.yum源(yum仓库) 要使用yum前,需要准备一个yum源(我们也称为yum仓库), 这个可以是一个互联网上的仓库,也可以是本地自己搭建的仓库. 仓库里面 ...
- 外星人电脑出现the system is running in low graphics mode的解决方法
问题现象: 执行删除GCC5.4.0: sudo apt-get remove gcc gcc-5重启电脑后,就显示the system is running in low graphics mod ...
- 三,k8s集群的应用入门
目录 kubernetes集群简单应用 kubectl常用命令: 创建pod service创建 测试其他pod通过series访问nginx 测试手动变更nginx对应的pod的ip pod和ser ...
- service与pod关联
当我们创建pod时,仅仅是创建了pod,要为其创建rc(ReplicationController),他才会有固定的副本,然后为其创建service,集群内部才能访问该pod,使用 NodePort ...
- PAT Basic 1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...
- Java语言基础(4)
1 关系运算符:>,>=,<,<=,==,!= 案例:Demo1 public class Demo1 { //偶数:能被2整除的整数 //2,4,6,8,10... //整除 ...
- 修正zen cart商品评论显示太短的问题
找到includes\modules\pages\product_reviews\header_php.php $reviews_query_raw = “SELECT r.reviews_id, l ...