学习C++ Day 03
知识点10
面向过程与面向对象的认识:我认为其实就是关注点不同,面向过程注重步骤(需要如何操作,过程是啥),而面向对象关注对象(有多少个体参与进来),但不是说其他就不关注只是侧重点不一样。拿洗衣服来说,面向过程就是拿盆,放水,放衣服,放洗衣粉,手搓等等;面向对象就是有四个对象:人、衣服、洗衣粉、洗衣机,然后四个对象交互完成洗衣服这个过程,在这个过程中,人不需要管洗衣机如何洗衣服的,各司其职,但又相互配合,四个对象只负责自己的事。
知识点11
类的引入:C 语言结构体中只能定义变量,在 C++ 中,结构体不仅可以定义变量,也可定义函数。不过在 C++ 中更喜欢用 class 代替。class 为定义类的关键字,Person为类名,{}中为类主体注意类定义结束后面分号不能省。
类中内容称为类的成员:类中变量称为类的属性或成员变量;类中函数称为类的方法或成员函数。类有两种定义方式:
(1)声明和定义全部放入类体中,注意成员函数如果在类中定义,编译器可能将其作为内联函数处理。
class Person
{
public:
//显示基本信息
void showinfo()
{
cout << _name << "-" << _sex << "-" << _age << endl;
}
public:
char* _name; //姓名
char* _sex; //性别
int _age; //年龄
};
(2)类声明放在 .h文件中,成员函数定义在 .cpp文件中,注意成员函数名前需要加类名 : :。其实就是分开写,只不过需要加类名和 : :。
知识点12
类访问限定符和封装:C++ 实现封装的方式:用类将对象的属性与方法结合在一块,让对象更完善,通过访问权限选择性的将其接口提供给外部的用户使用。
(1)public 修饰的成员在类外可以被直接访问。
(2)protected 和 private 修饰的成员在类外不能被直接访问(此处 protected 和 private 是类似的)。 访问权限作用域从该访问限定符开始到下一访问限定符出现为止,后面如果没有,就到 } 即类结束。
(3)class 的默认访问权限为 private ,struct 为 public (因为 struct 要兼容 C)。
面向对象三大特性:封装、继承和多态。封装:将数据和操作数据的方法进行有机结合,隐藏对象的实现细节,仅对外公开接口来和对象进行交互。
知识点13
类的作用域:类定义了新的作用域,类的所有成员都在其中。在类外定义成员时,需要使用 : :作用域操作符指明成员属于那个类域(就是声明和定义分开写时那种用法)。
知识点14
类的实例化:类是对对象进行描述的,实际并没有分配实际的内存空间,实例化出来的对象,占用实际的物理空间,存储类的成员变量。可以理解为类实例化就是用建筑设计图造房子,类就像设计图。
void Test()
{
Person man;
man._name = "jack";
man._age = 10;
man._sex = "男";
man.showinfo();
}
知识点15
类对象存储与大小:只保存成员变量,成员函数存放在公共代码段。一个类的大小就是类中“成员变量”之和,注意内存对齐。类中仅有成员函数或者什么都没有时(空类)时,编译器给了空类一个字节来标识该类的存在。
对齐规则:
(1)第一个成员在与结构体偏移量为0的地址处。
(2)其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。vs默认对齐数为8。
(3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐数取最小)的整数倍。
(4)如果嵌套了结构体的情况,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整倍。
知识点16
this 指针:C++ 编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体内中所有“成员变量”的操作,都是通过该指针去访问。只不过所有操作对用户是透明的,即不需要用户来传递,编译器自动来完成。
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
// void Print(Date* this)
// {
// cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
// }编译器会对函数进行处理
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1, d2;
d1.Init(2022, 1, 11);
d2.Init(2022, 1, 12);
d1.Print(); //底层实际是d1.Print(&d1);
d2.Print(); //同理 d2.Print(&d2);
return 0;
}
this 指针特性:
(1)this 指针类型:类类型* const ,即成员函数中,不能给 this 指针赋值。
(2)只能在“成员函数”的内部使用。
(3)this 指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参,所以对象中不存储 this 指针。this 指针是形参,所以 this指针是跟普通参数一样存在函数调用的栈帧里面。
(4)this 指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过 ecx寄存器自动传递,无需用户传递。
更多推荐

所有评论(0)