类与对象的笔记总结

类的访问限定符及封装

1.封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
2.访问限定符:public修饰的成员在类外可以直接被访问;pritected和private修饰的成员在类外不能直接被访问(此处protect和private是类似的);
class和struct的区别:class的默认访问权限为private;struct的默认访问权限为public。

类的实例化

类只是一个模型一样的东西,定义一个类实质上并没有分配实际的内存空间来存储它。
当类实例化出一个对象时,此时该对象就会占用实际的物理空间,存储类成员变量。
这就好比声明与定义之间的关系。
声明只是一种承诺,承诺要干什么,但是还没有做。
定义就是对承诺的内容进行实操,落实它。

类对象模型

1类对象的存储方式:对象中只存储成员变量,不存储成员函数。
原因是一个类可以实例化出N个对象,每个对象的成员变量都可以存储不同的值,但调用的函数却是同一个。如果每个对象里边都存储成员函数,而这些成员函数又是一样的,会造成空间的浪费。因此成员函数被放在公共的代码区段
2.计算类对象的大小的方法:计算成员变量之和并且考虑内存对齐。
注意:没有成员变量的类的大小是1byte。原因是开一个字节不是为了存数据,而是占位,表示对象存在。

this指针

1.this指针:
c++编译器给每个”非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。用户不需要来传递(vs下是用ecx这个寄存器来传递的),编译器自动完成。
2.this指针被存在栈上,因为他是一个形参(函数栈帧的一部分)。
3.this指针的特性:
this指针的类型:类类型 const*;
只能在成员函数的内部使用;
this指针本质是成员函数的一个形参,所以对象中不存储this指针;
this指针一般由编译器通过ecx寄存器自动传递,不需要用户传递。

类的6个默认成员函数

1.构造函数
作用:在对象构造时调用的参数,这个函数完成初始化工作
特征:
函数名与类名;
无返回值;
对象实例化时编译器自动调用对应的构造函数;构造函数可以重载;
若类中没有显式定义构造函数,则c++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成无参的默认构造函数。
编译器生成的默认构造函数有如下特征
a.针对内置类型的成员变量没有做处理
b.针对自定义类型的成员变量,会调用自定义类型的成员变量的构造函数初始化。
默认构造函数分为三种:
自己实现的无参构造函数;
自己实现的全缺省构造函数;
我们不写的时候,编译器自己生成的无参的默认构造函数。
这三种默认构造函数只能同时存在一个

拷贝构造函数

拷贝构造函数是构造函数的一个重载形式。
拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。`

Date(const Date& d)//日期类
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

若未显式定义,系统会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

析构函数

完成对象里面的资源清理工作,不是完成对对象的销毁。
其特征如下:
析构函数名是在类名前加上字符 ~ ;
无参数无返回值;
一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
对象生命周期结束时,c++编译系统自动调用析构函数。
例如
~seqlist()
{
if(_pData)
{
free(_pdata);//释放堆上的空间
_pData = NULL;//将指针置空
_capacity = 0;
_size = 0;
}
}

赋值运算符重载Date&(const Date& d)

1.运算符重载:作用:让自定义类像内置类型一样去使用运算符。
一个类如果没有显示定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝(浅拷贝),这点和拷贝构造函数相似。
浅拷贝会导致俩个问题;第一个问题:可能会造成同一块内存空间释放俩次,最终会导致程序崩溃;第二个问题:当一个对象改变成员变量的值的同时,另一个对象的成员变量的值也会改变。

对const的理解

非const对象可以点用非const成员函数和const成员函数;const成员函数只能其他const成员函数。const对象可以调用const成员函数。

初始化列表

初始化列表:可以理解成初始化列表时对象的成员变量的定义的地方。
注意:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次);
类中包含以下成员,必须在初始化列表位置进行初始化。(即在被定义的地方进行初始化)
a.引用成员变量
b.const 成员变量
c.自定义类型成员(该类没有默认构造函数)
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
当用explict关键字修饰构造函数,将会禁止单参构造函数的隐式转换
例如:Date d =10;
在c++11中可以传多个参数进行成员变量的初始化,同时使用explict关键字也会禁止构造函数的饮食转换。

static成员

用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。
特性:
1.static成员变量不存在对象中,存在于静态区,属于这个类的所有对象,也是属于这个类。
2.static成员函数没有this指针,不使用对象就可以调用,
类名::func()
3.在静态成员函数中,不能访问非静态成员变量和非静态成员函数。
4.非静态成员函数中,可以调用(非)静态成员函数 /变量。
非静态成员函数可以调用类的静态成员函数;只要突破类域+访问限定符,类里面是一个整体。在类里面就不受访问限定符的限制了。
C++11中非静态成员变量,可以在成员声明时给缺省值
友元与友元类
友元突破了类的封装,增加了耦合度。
用处:"<< " " >>"的友元函数重载
友元函数可以直接访问类的私有成员,他是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时加上friend关键字。
特性:
1.友元函数可以访问类的私有成员和保护成员,但不是类的成员函数。
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问的限制;一个函数可以是多个类的友元函数。
4.友元函数的调用与普通函数的调用和原理相同
内部类
概念:如果一个类定义在另一个类的内部,这个类就叫做内部类。
特性:内部类天生就是外部类的友元类。此时内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
1.内部类可以定义在外部类的pubilc,protected,private。
2.内部类可以直接访问外部类中的static,枚举成员,不需要外部类的对象 / 类名。
3.sizeof(外部类)=外部类的大小,和内部类的大小没有任何关系

你可能感兴趣的:(c++)