目录this指针一、this指针的引出1 .库this指针的引入作用:2.this指针的特性2、类的6个默认成员函数1 .构造函数1.1概念1.2特性2 .析构函数2.1概念2.2特性3 .特性3
this指针一,this指针抽屉1 .引入库this指针角色: c编译器在每个“非静态成员函数”中添加隐藏的指针参数,该指针为http://www.Sina 函数主体中的所有成员变量,但所有操作对用户透明。 这意味着它不需要用户传递,而是由编译器自动完成。 this指针尽量用const修饰
33558www.Sina.com//(1)先识别类名; )2)识别数据成员(3)改写函数成员
2.this指针的特性this指针的当前对象:类类型* const只能在“成员函数”内部使用this指针3358www.Sina.com/,实际上是3358www.Sina.com/this指针为识别类的顺序,通常由编译器通过ecx寄存器自动传递,# define _ CRT _ secure _ no _ warnings1# includeiostrestred this指针调用步骤1 (标识类名2 )标识类中的成员变量3 )标识成员函数并修改成员函数(*/classstudent ) public3360//this指针- -类对象指向语音识别签名的char* name、char* gender、intage (语音识别签名) char* name、char* gender、intage //谁调用此函数就有人strcpy(_name,name ); 相当于//strcpy(this-_name,name ); src py (发件人,发件人); _age=age; //this是对象地址(} void PrintInfo () ) cout_name ) _gender ) _ageendl; }private: char _name[20]; char _gender[3]; int _age; (; int main () { Student s1,s2; S1.setstudentinfo('Zhangsan ','男',14 ); S2.setstudentinfo('lisi ','女',5 ); 返回0; }函数试图操作对象时,必须传递类对象的地址。 否则,无法修改实际参考对象。 因此,我们知道类的成员函数实际上也有一个隐藏指针,指向调用该函数的对象本身。 此隐藏指针称为This指针,其值是当前调用的成员函数所在对象的起始地址。
二、类的6个默认成员函数类型初始化工作;本质清洁工作;一个成员函数的形参初始化创建对象;成员函数第一个隐含的指针形参分配给另一个对象;构造函数:主要完成:主要由普通对象和const对象进行寻址
1 .构造函数1.1概念析构函数:主要完成为拷贝构造:使用同类对象,赋值重载:把一个对象,编译器在创建类类型对象时自动调用
1.2特性3358www.Sina.com/是一个特殊的成员函数。 虽然构造函数的名称称为构造函数,但必须注意构造函数的主要任务是取地址重载:,而不是打开空间创建对象,其特征如下:
构造函数
strong>。无返回值。对象实例化时编译器自动调用对应的构造函数。构造函数可以重载。 class Date{public : // 1.无参构造函数 Date () {} // 2.带参构造函数 Date (int year, int month , int day ) { _year = year ; _month = month ; _day = day ; }private : int _year ; int _month ; int _day ;};void TestDate(){ Date d1; // 调用无参构造函数 Date d2 (2015, 1, 1); // 调用带参的构造函数 // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明 // 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象 Date d3(); } 2.析构函数 2.1 概念前面通过构造函数的学习,我们知道一个对象时怎来的,那一个对象又是怎么没呢的?
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
析构函数是特殊的成员函数。
其特征如下:
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拿对象初始化对象时,为拷贝构造函数。
3.2 特性拷贝构造函数也是特殊的成员函数,其特征如下:
拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。参数必须使用类类型对象引用传递 class Date{public: Date(int year = 1900, int month = 1, int day =1)//构造函数 { _year = year; _month = month; _day = day; } Date(const Date& d)//拷贝构造函数,用Data去初始化它本身,两者实质是一样的 { _year = d._year; _month = d._month; _day = d._day; }private: int _year; int _month; int _day;};int main(){ Date d1; Date d2(d1); return 0; } 4.运算符重载 4.1 概念运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
注意:
(1)不能通过连接其他符号来创建新的操作符:比如operator@
(2)重载操作符必须有一个类类型或者枚举类型的操作数
(3)用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
(4)作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
(5).* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。(成员指针访问运算符、作用域运算符、长度运算符、三目运算符、成员访问运算符均不能重载)记忆:带点的符号要注意
友元函数
friend void fun(const Test &t);//友元函数其对象可以直接访问私有数据friend void operator+(int val,const Complex &c);//友元函数声明加法,需要传递两个参数成员函数在进行运算符重载时,只需要传递一个参数,另一个参数是由this指针直接传递的
友元函数在进行运算符重载时,需要传递两个参数
i++和++i的区别:前++效率高于后++,因为不产生临时对象。
不带整型参数就是++i(前++),带整型参数就是i++(后++)
类里面的六个常用函数 重点重点敲敲黑板
class Test{public: Test();//构造函数 Test(const Test &);//拷贝构造函数 Test& operator=(const Test &); //赋值语句 ~Test();//析构函数 Test* operator&();//取地址运算符 const Test* operator&()const;//常对象的取地址运算符};赋值运算符主要有四点:offer p24
参数类型返回值检测是否自己给自己赋值返回*this一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。 string& operator=(const& string &s){ if(this!=&s) { free(m_data); m_data=(char*)malloc(strlen(s.m_data)+1); assert(m_data!=NULL); strcpy(m_data,s.m_data); } return *this;}浅拷贝:只拷贝一个指向,没有拷贝空间。
深拷贝:拷贝了指向和空间,获得了新空间。
异常安全:程序发生异常后,代码还可以维持状态稳定。(剑指offer p24)