C++复习2
类class
class A{
public:
int i;
private:
int j;
protected:
int k;
}
类的成员写在外面
1)写在类里面的方法默认是内联的
2)写在类外面的方法,加上inline修饰也可以是内联的
class A{
public:
void fun1(
int i);
void fun2(
int i);
A(
int i);
}
A::A(
int i){
}
void A::fun1(
int i){
}
inline
void A::fun2(
int i){
}
封装
通过公有的方法,访问私有的属性
构造函数(构造器)
1)构造函数允许重载
2)当实例化对象时,会自动使用构造器
实例化
在栈上实例化
类名 对象名;/类名 对象名(参数);
在堆上实例化
类名 *对象名 = new 构造器;
析构函数(析构器)
没有参数列表,没有返回值,在名字前面加~(名同类名)
析构器不能重载
删除对象
栈上对象,自动释放
堆上对象,手动释放 (delete 对象名)
//class
A
A *p = new
A()
delete p
A *pa = new
A[
2]{
A(
1,
2),
A(
3,
4)}
delete[] pa
私有化构造器和析构器
1)构造器私有不能构造对象;
2)析构器私有可以创建堆上对象,不能创建栈上对象
在堆上析构对象时,无法使用delete,要用调用方法来析构。
this关键字
1)内置类型:int char 等基本数据类型
2)自定义类型:类 结构体 this等
3)本质: 类 * const this;
4)类中方法第一个形参,为隐藏的 “类 * const this”
面向对象编程注意事项
1>若没有声明,系统会默认添加
i)无参构造器
ii)复制构造器
iii)赋值运算符重载
2>一旦声明一个构造器,系统就不会再增加无参构造器
3>析构的顺序
i)栈上对象 在return 0;前,按照与实例化相反的顺序析构(因为系统是通过一个个出栈来析构)
ii)堆上对象 在delete时析构
复制构造器
定义:
拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量
特点:
1>复制构造器可以重载
2>何时被调用
i)一个对象以值传递的方式传入函数体
ii)一个对象以值传递的方式从函数返回
iii)一个对象通过另一个对象进行初始化
全局函数:
使用复制构造器的为√反之为×
1)形参
以值传递的方式传入一个对象 √
以传引用的方式传入一个对象 ×
2)返回值
以值传递的方式从函数返回一个对象 √
此时没有接收:会造成匿名对象
以传引用的方式从函数返回一个对象 ×
此时没有接收:这个返回值是地址,若不接受,被别人利用的话很危险
构造器、复制构造器、析构器、赋值运算符重载对比
class Base{
public:
//构造函数
Base();
//复制构造函数
Base(const Base &);
//重载赋值操作符
Base &operator=(const Base &);
//析构函数
~Base();
...
private:
...
};
深复制和浅复制
深复制(深拷贝):如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深复制(深拷贝)。
浅复制(浅拷贝):反之,没有重新分配资源,就是浅复制(浅拷贝)。
深拷贝好还是浅拷贝好?
如果实行浅拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。
这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。
这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
友元函数
作用:允许该函数访问私有成员
格式:
class 本类名{
friend 返回值类型 函数名(...,本类名 &对象名,...);
}
返回值类型 函数名(...,本类名 &对象名,...){
}
友元类
作用:允许该类访问私有成员
格式:
class 类A{
friend 类B;
}
class 类B{
返回值类型 fun(...,类A &对象名,...){
//...
}
}
static关键字
1)在C中:
1.1)局部
static修饰的局部变量,存放在全局区,其生命周期得到延长
1.2)全局
1.2.1)变量
static修饰的局部变量,只能在本文件中使用,不能被外部访问;
1.2.1)函数
static修饰的函数,只能在本文件中使用,不能被外部访问;
2)在C++中:
2.1)不能修饰类
2.2)修饰类的成员
2.2.1)修饰成员变量
i.共有的
要在全局初始化。
使用:
this->该变量
对象.该变量
类::该变量
ii.私有的
要在全局初始化。
使用:
不能直接访问,需要使用静态的方法来访问
2.2.2)成员方法
静态的方法只能访问类内的静态成员、全局的变量和函数。
i.共有的 对外部提供接口,使其可以访问私有的static成员变量
ii.私有的 意义不大
const与类
1)const修饰类的属性(成员变量)
1.1)当const修饰类的属性(成员变量)的时候是分配空间的,也可以通过指针修改其值
例:
A a(
1,
3);
int *p = (
int *)&a.i;
*p =
255;
1.2)const修饰的属性可以通过参数化列表进行初始化
class A
{
public:
const int i ;
A(
int a =
1,
int b =
2):i(a),j(b){
}
private:
int j ;
};
/**
* 因为当系统在构造对象的时候会调用参数化列表的值初始化const属性。
* 如果在构造函数的方法体内通过"="赋值运算符初始化const属性是不可以的,
* 因为此时对象已经构造完成。
*/
2)const修饰成员方法
2.1)const在函数最前面时,该方法还不是const方法,只是返回值被const修饰。
2.2)const在函数最后面时,该方法是const方法,不同通过其修改对象,同时它的返回值也被const修饰了。
const方法:
1)this指针由 “类* const this” 变为 “const 类* const this”,这导致其只能访问对象里的内容,不能修改对象里的内容
2)同时const方法的返回值也为const类型,不能被修改
const与对象
1)const修饰的对象,叫做常对象(因为其值不可以被改变)。
1.1)特性1:const对象只能调用const方法
1.2)特性2:const对象访问共有的成员变量的时候,只能读,不能改。
2)非const对象既可以调用const方法也可以调用非const方法
转载请注明原文地址: https://ju.6miu.com/read-23126.html