南京公司网站制作教育培训,网页模板网站,带动画引导的网站,注册域名卖钱很暴利吗类的引入
C语言中#xff0c;结构体中只能定义变量#xff0c;在C中#xff0c;结构体内不仅可以定义变量#xff0c;也可以定义函数。
而为了区分C和C我们将结构体重新命名成class去定义 类的定义
标准格式#xff1a;
class className
{// 类体#xff1a;由成员函…类的引入
C语言中结构体中只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。
而为了区分C和C我们将结构体重新命名成class去定义 类的定义
标准格式
class className
{// 类体由成员函数和成员变量组成}; // 一定要注意后面的分号注意结构体不是函数不管是C的struct还是C的class 最后大括号完了都得加上“”
class为定义类的关键字ClassName为类的名字{}中为类的主体注意类定义结束时后面分号。 类中的元素称为类的成员类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式
声明和定义都在结构体中
同一个.cpp文件下#include iostream
using namespace std;
//. 声明和定义全部放在类体中
class Date
{
public://结构体中的函数void Init(int year,int month ,int day){_year year;_month month;_day day;}void ShowDate(){cout _year - _month - _day endl;}
public://结构体中的变量int _year;//年int _month;int _day;};
int main()
{Date dt;dt.Init(2024, 4, 1);dt.ShowDate();return 0;
} 声明在.h定义在.cpp常用
.h声明 person#include iostream
using namespace std;
//. 声明和定义全部放在类体中
class Date
{
public://结构体中的函数void Init(int year, int month, int day);void ShowDate();
public://结构体中的变量int _year;//年int _month;int _day;
};.C person#include person.h//结构体中的函数
void Date::Init(int year, int month, int day)
{_year year;_month month;_day day;
}
void Date::ShowDate()
{cout _year - _month - _day endl;
}.C main
#include person.hint main()
{Date dt;dt.Init(2024, 4, 1);dt.ShowDate();return 0;
}为什么使用域作用限定符
回答当在不同文件中声明定义可能会出现相同函数但是又因为结构体和命名空间等的包装就需要专门去打开。
成员变量前加“_” 成员变量结构体里的变量和函数参数变量都为相同的时无法区分为了更明显表现在代码上各变量关系常用“_”来表示成员变量 类的访问限定符及封装 上图一个会报错一个不会报错其中最关键的在于public。由此我们能看出这个结构体默认是不让你胡乱在结构体外修改他的结构体内的变量的。
我们并不希望结构体内的有些东西会被修改例如成员变量。
访问限定符 说明
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class的默认访问权限为privatestruct为public(因为struct要兼容C) 封装
C实现封装的方式用类将对象的属性与方法结合在一块让对象更加完善通过访问权限选择性的将其 接口提供给外部的用户使用。
面向对象的三大特性封装、继承、多态
定义封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行 交互。
本质通过将我们想要保护的隐私东西用保险箱保护(封装)起来。
通过不同的保护容器来实现不同的效果例如可以公开的信息就用透明箱子等 类的作用域 类定义了一个新的作用域类的所有成员都在类的作用域中。在类体外定义成员需要使用 :: 作用域解析符 指明成员属于哪个类域。
类的实例化
定义用类类型创建对象的过程称为类的实例化由图纸-实物
1.类只是一个模型一样的东西限定了类有哪些成员定义出一个类并没有分配实际的内存空间来存储它
2.. 一个类可以实例化出多个对象实例化出的对象 占用实际的物理空间存储类成员变量
简单理解类只是给你设计了一个住宅区的建筑图纸你可以用这份图纸在任何地方去建造住宅区这个过程给类申请空间就叫做实例化过程
//类--设计图纸
class Date
{
public:void Init(int year, int month, int day){_year year;_month month;_day day;}void ShowDate(){cout _year - _month - _day endl;}
public:int _year;int _month;int _day;
};int main()
{Date dt;//类的实例化--开实际空间dt.Init(2024, 4, 1);dt.ShowDate();return 0;
}类的对象大小的计算
结论一个类的大小实际就是该类中”成员变量”之和当然也要进行内存对齐注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类。 类的存储位置
注意类里面函数运行的指令是存在代码段里但是运行过程中的参数是存在栈里
结构体内存对齐规则 1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字对齐数的整数倍的地址处。
注意对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8
3. 结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。
4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是 所有最大对齐数含嵌套结构体的对齐数的整数倍。
类成员函数this指针
由来C编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有成员变量的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。
this指针的特性:
1.this指针的类型类类型* const
2. 只能在“成员函数”的内部使用
3.this指针是成员函数第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递不需要用户传递
4.this指针本质上其实是一个成员函数的形参是对象调用成员函数时将对象地址作为实参传递给this 形参。所以对象中不存储this指针。 this存在哪里
1.栈因为他是隐含形参
2.VS下是通过ecx寄存器 空指针问题
//测试空指针问题
class Date
{
public:void Init(int year, int month, int day){cout this endl;this-_year year;this-_month month;this-_day day;}void Show(){cout this endl;cout func() endl;}
public:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(1111, 11, 1);Date* ptr nullptr;ptr-Show(); //正常运行(*ptr).Show(); //正常运行ptr-Init(3333, 33, 3);//运行崩溃return 0;
}
重点解引用使用时主要看我们所申请的这个对象里包不包括我们要调用的函数或者变量。
解读代码
结构体的解引用不一定都是有效的例如ptr-Init这里进去后要修改_year的数据此时ptr解引用后并无实际存储数据空间只是单纯的申请了了一个地址空间。所以此时解引用后是无法进行操作的。
show函数他只进行显示地址等并没有数据的操作过程