目录
前言
本章是类和对象的知识,主要是对面向对象和面向过程的区别,C语言是面向过程,那在C++中主要是关注在面向对象中。
一、类的定义
上一章中我们讲到C++是兼容C语言的,所以在C++兼容C语言里的struct的所有用法,struct同时也升级成类,类中升级有几点:
1. 类名就是类型,无需再使用typedef去重定义命名,使用类实例化时也无需再添加struct。
//旧
typedef struct stall{
//.......
}stall;
stuct stall a1;//或
stall a2;
//新类
struct stall{
//.......
};
stall a;
2. 类里面可以定义函数了
struct Scom{
void fun1(){
//.....
}
void fun2(){
//.....
}
void fun3(){
//.....
}
};
但是在c++中一般都是用class类定义类的,也很简单只需要将struct换成class即可。
//class为定义类的关键字,Classname为类的名字,{}为类的主体
class Classname{
};
二、访问限定符
类中引入了访问限定符,有三种 public 、protected 、private
public(公有)
意思是类外部是可以使用或访问以下的内容。
protected(保护)
protected与下面的private功能上目前区别不大,在后面学到继承就有区别,主要先学习private为准。
private(私有)
private的功能在于限定类外不可访问,但是在类的内部可以访问,例:
这里可以看到给变量a进行了private限定符,类外部就不可访问了,那可以在类内部写个函数,让外部进行访问:
在功能上struct和class是一样的。
但是class默认是private,struct是public的,我们使用class类时,一般定义的成员变量都是私有的。
三、类声明和定义分离
当实现类声明与定义分离时,在定义中要指定类的域要带上 :: 例如:类 :: 函数
在一般情况下 .h 声明了也可以直接定义函数的,例:
在类里直接定义的话函数默认是inline内联函数,内联函数可以直接认为是用于优化程序的关键字。
那在一般情况下,我们长的函数就声明和定义分离,短小的函数可以直接在类里面定义。
四、外部变量和成员变量的区别与注意
我们在对类进行传参时,同名变量是不影响成员变量的数据的,但不建议变量与成员变量同名,因为不容易区分。
所以我们为了区分传参的变量与成员变量一般会在成员变量加上 _ ,例:_a就区别于a。
五、类的实例化
直接理解为给类实例一个对象,开辟一个空间。
例:class Person{
};
main: Person a; <--实例化对象
六、类对象的模型
成员变量会独立存储在一个一块独立的对象空间中;
类成员函数会把函数放在一个公共区域,主要是因为空间的可循环利用空间。
类和结构体一样会内存对齐,占用空间规则一样。
内存对齐的知识点(面试会考)
七、类的this指针
在类函数内部用 this -> 变量是可以获取或修改类内的成员变量的,函数传参不可修改。
this 是指向类内部的成员变量
面试题
this 指针会存在哪个位置?
会在栈帧中,vs下会存到 exc 寄存器里。
八、类中的构造函数
构造函数有两种情况
默认生成
在没写构造函数的情况下,编译器会默认生成一个。
这里的默认生成是内置类型成员不做处理,自定义类型回去调用默认构造函数。
用户自己写
构造函数也可以用户自己编写一个,在用户写了构造函数后编译器不会再生成使用默认生成的构造函数。
默认构造有三种
1.不写构造函数
2.无参构造函数
3.全缺省调用
三种默认构造函数只能存在一种
总结,1.一般情况下,都要写上构造函数。2.如果成员都是自定义类型或声明时给了缺省值就可以无需在构造函数上定义好成员变量。
九、析构函数
析构函数与构造函数相反,构造函数是对成员变量空间的申请与赋值,那么析构函数就是对完全对象中资源的清理,而不是对对象的销毁。
一般普通变量是无需写析构函数,而向栈申请空间的成员变量写析构函数才有意义,销毁动态内存。
注意:1.析构函数名是在类名前加上字符 ~
2.是无参无返回值的类型
3.一个类只能有一个(如未写析构函数,系统会自动生成一个,不能重载析构函数)
4.在对象的生命周期结束时,C++会自动调用析构函数
默认生成的析构函数,行为跟构造函数相似,内置类型成员是不会做任何的处理,但如果是自定义类型成员会去调用自己的析构函数。
总结
本章主要是简单讲解了类和对象的基本概念与用法,下一章会详讲类的重载等....知识点。