从今天开始让我们来讨论以下C++:
目录
1.面向对象认识
在大家最开始接触算法时应该是C语言那么C语言是一个面向过程的语言,我们需要求解问题的每一个步骤,而C++是一个面向对象的语言,我们关注的是对象而至于具体对象内部是怎么样实现的我们不需要操心
2.类
1.什么是类
class Date {
//类体:由成员函数和成员变量构成
};
2.如何定义类
1.声明和定义全部在类中(成员函数在类中丁酉,编译器可能会将其视为内联函数)
class Date {
public:
void test{
cout<<year<<month<<day<<endl;
}
int year;
int month;
int day;
};
2.定义和声明分离(则需要在函数定义时在前面用类名加以修饰)
class Date { //test.h
public:
void test1();
int year;
int month;
int day;
};
void Date::test1() { //test.cpp
cout << year << month << day << endl;
}
在类外定义成员是需要用::来指明成员属于哪一个类域
3.类的访问限定符
1.public(公有)
其修饰成员可以在类外直接去访问
2.protected(保护)
3.private(私有)
private和protected修饰成员在类外不能直接访问
那么struct和class的区别是什么呢?
C++需要去兼容C语言,C++中struct也可以当作结构体使用,另外其还能用来定义类与class方式相同,区别在于class默认访问权限为private而struct默认为公有
4.类的实例化
1.类是对对象进行描述的一个模型,所以定义一个类并没有去分配内存空间给它
2.一个类可以实例化多个对象,实例化出的对象才占用空间,就比如类就像是一个房子图纸,它并没有以房子这样的实体存在,但是可以通过它实例化出许多盖出的房子
class Date {
public:
void test{
cout<<year<<month<<day<<endl;
}
int year;//是指声明并没有开空间,声明只是承诺,定义是可以编译成地址实现的
int month;
int day;
};
int main(){
Date d1;//这才是定义
return 0;
}
5.类成员大小计算
只保存成员变量,成员函数存放在公共代码段
类在计算大小时也要注意内存对齐规则
class A {
public:
void test1() { //只有函数按理来说应该是0但是要进行展位操作会分配一个空间
//来证明这里是有一个对象的
} //大小为1
};
class B { //大小为0
};
class C { //该类大小为4
public:
void test2() {
}
private:
int year;
};
内存对齐规则
1.第一个成员在结构体偏移量为0的地址处
2.其他成员变量对其到对齐数的整数倍地址处
3.对齐数=编译器默认的对齐数与该成员大小的较小值
4.对于嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体整体大小就是最大对齐数(包括嵌套结构体对齐数)的整数倍
6.this指针
lass Date {
public:
void init(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date d1;
d1.init(2023, 10, 23);
Date d2;
d2.init(2023, 10, 24);
return 0;
}
函数体中并没有对的d1和d2有所区分,那么在调用时时怎么区分来的?
所以我们就引入了this指针,在函数体的接受参数中有一个隐藏的指针参数,它指向当前的对象,所有成员变量也通过该指针访问,只不过不需要用户完成,编译器自动实现
1.this指针特点
1.this指针的类型为*const,成员函数中不能给this指针赋值
2.只在成员函数内部使用
3.其本质为成员函数的形参,在对象调用成员函数时,将对象地址作为实参传递给this形参,座椅对象中不存储this指针(this指针作为一个形参存储在栈帧中)
4.其是成员函数的第一个隐含的指针形参,由编译器通过寄存器自动传递
(会继续更新,欢迎各位大佬批评指正)