重庆网站设计开发,企业网站seo公司,怎么做网站收录,天津建设工程信息网报名目录 1.面向过程与面向对象
c语言的视角#xff1a;
c的视角
2. 类的引入
3. 类的定义
3.1 类的两种定义方式
3.2 成员变量如何命名
4. 类的访问限定符与封装
4.1 访问限定符
4.2 封装
5. 类的作用域
6. 类的实例化
7. 类对象模型
7.1 怎么计算一个类对象的…目录 1.面向过程与面向对象
c语言的视角
c的视角
2. 类的引入
3. 类的定义
3.1 类的两种定义方式
3.2 成员变量如何命名
4. 类的访问限定符与封装
4.1 访问限定符
4.2 封装
5. 类的作用域
6. 类的实例化
7. 类对象模型
7.1 怎么计算一个类对象的大小
7.2 类对象存储的方式
7.3 结构体内存对齐规则
8. this指针
8.1 this指针的引出
8.2 this指针的特性
结语 1.面向过程与面向对象 c语言与c分别是面向过程与面向对象的拥护者。 c语言是面向过程的关注的是解决问题的过程分解求解步骤通过函数调用逐步解决问题。 C是基于面向对象的关注的是对象将一件事情拆分成不同的对象靠对象之间的交互完成。 我们来看看同一事件在面向过程与面向对象的眼里究竟是怎样的。以洗衣服为例。
c语言的视角 c的视角 2. 类的引入 在c语言中自定义类型struct结构体只能定义变量但在c中结构体不但能定义变量还能定义函数。 在c中将结构体称为类其关键字为class但同时兼容c语言的struct 它们之间的区别在后面会讲到。 3. 类的定义
class className
{
// 类体由成员函数和成员变量组成
}; // 一定要注意后面的分号 class是c定义类的关键字className是类的名字{ } 为类的主体。注意{ } 后的分号。 { } 中的内容称为类的成员其内定义的变量称为类的属性或成员变量函数则称为方法或成员函数。 3.1 类的两种定义方式
1.声明与定义全部放入类体内 (如果函数定义在类内则编译器有可能将函数当作内联函数处理) 。
2. 声明与定义分离声明在类内放入 .h 文件定义在类外放入 .cpp 文件。
我们上代码来看看
//声明与定义全部放在类体内
class Person
{
public:void ShowInfo(){cout name: _name age: _age endl;}char* _name;int _age;
};
这里声明与定义分离为了方便我将他们定义在了同一文件内。
//声明与定义分离
class Person
{
public:void ShowInfo();char* _name;int _age;
};#includePerson.h
void Person::ShowInfo()
{cout name: _name age: _age endl;
}
注意下图中圈出来的地方成员函数定义在类外时需要在函数名前用域作用符连接类名。 3.2 成员变量如何命名
我们看下面这段有关日期类的代码
class Date
{
public:void Init(int year, int month, int day){year year;month month;day day;}int year;int month;int day;
};
这种代码不仅可读性差还可能会造成歧义因此一般建议成员变量的命名要与正常变量名做区别比如在成员变量名前加_或m_。代码如下
class Date
{
public:void Init(int year, int month, int day){_year year;_month month;_day day;}int _year;int _month;int _day;
};
4. 类的访问限定符与封装 c实现封装的方式用类将对象的属性与方法结合在一起通过访问权限选择性的将其接口提供给外部使用。 那么是如何实现访问限定的呢
这个就要靠访问限定符了。
4.1 访问限定符 【访问限定符说明】 1. public修饰的成员在类外可以直接被访问 2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的) 3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 4. 如果后面没有访问限定符作用域就到 } 即类结束。 5. class的默认访问权限为privatestruct为public(因为struct要兼容C) 注意访问限定符只在编译时有用当数据映射到内存后没有任何访问限定符上的区别 在这里我们就可以解答struct与class区别的问题了。 C需要兼容C语言所以C中struct可以当成结构体使用。另外C中struct还可以用来 定义类。和class定义类是一样的区别是struct定义的类默认访问权限是publicclass定义的类默认访问权限是private。注意在继承和模板参数列表位置struct和class也有区别后序给大家介绍。 4.2 封装 面向对象有三大特性封装、继承和多态。当然并不代表只有这三大特性哦。 我们先来学习封装那么什么是封装呢 封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互。封装本质上是一种管理让用户更方便使用类。 比如对于电脑这样一个复杂的设备提供给用户的就只有开关机键、通过键盘输入显示器USB插孔等让用户和计算机进行交互完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件 对于计算机使用者而言不用关心内部核心部件比如主板上线路是如何布局的CPU内部是如何设计的等用户只需要知道怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时在外部套上壳子将内部实现细节隐藏起来仅仅对外提供开关机、鼠标以及键盘插孔等让用户可以与计算机进行交互即可。 在C语言中实现封装可以通过类将数据以及操作数据的方法进行有机结合通过访问权限来隐藏对象内部实现细节控制哪些方法可以在类外部直接被使用。 5. 类的作用域 类定义了一个新的作用域类的所有成员都在类的作用域中。在类体外定义成员时需要使用 ::作用域操作符指明成员属于哪个类域。 比如下面这段代码
class Person
{
public:Person(char* name,int age10){_name name;_age age;}void showinfo();
private:char* _name;int _age;
};void Person::showinfo()
{cout _name _age endl;
}int main()
{char name[] 张三;Person zs(name, 20);zs.showinfo();return 0;
}
这里需要用域作用符指明类域。 6. 类的实例化 用类类型创建对象的过程称为类的实例化 1 . 类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没有分配实际的内存空间来存储它 2 . 一个类可以实例化出多个对象实例化出的对象占用实际的物理空间存储类成员变量Person类是没有空间的只有Person类实例化出的对象才有具体的年龄。 3 . 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东西但是并没有实体的建筑存在同样类也只是一个设计实例化出的对象才能实际存储数据占用物理空间。 7. 类对象模型
7.1 怎么计算一个类对象的大小
class A
{
public:A(int a 10, int b 20){_a a;_b b;}
private:int _a;int _b;
};
我们可以看到在A类中既有成员变量也有成员函数那么我们要怎样计算他的大小呢
7.2 类对象存储的方式
我们用下面的代码做一个实验来看看类对象是怎么存储的。
class C//只有成员变量
{
private:int _f;int _y;
};class D//空类
{};class E//只有成员函数
{
public:void showinfo(){cout D endl;}
};
int main()
{cout sizeof(C): sizeof(C) endl;cout sizeof(D): sizeof(D) endl;cout sizeof(E): sizeof(E) endl;return 0;
} 由此可见一个类的大小实际就是该类中”成员变量”之和当然要注意内存对齐 注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类的对象。 那么对象是如何调用成员函数的呢 答案就是成员函数保存在公共的代码段内谁有需求谁就调用。 7.3 结构体内存对齐规则 1. 第一个成员在与结构体偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字对齐数的整数倍的地址处。 注意对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8。 3. 结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。 4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍 这一点与c语言结构体对齐内容相同有需要的朋友可以看我的这篇文章。
结构体的相关知识https://mp.csdn.net/mp_blog/creation/editor/133279934
8. this指针
8.1 this指针的引出
我们先简单实现一个日期类
class Date
{
public:void Init(int year, int month, int day){_year year;_month month;_day day;}void showinfo(){cout _year / _month / _day endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2024, 2, 1);d1.showinfo();Date d2;d2.Init(1997, 1, 1);d2.showinfo();return 0;
} 在上面日期类代码中我们实现了两个对象的初始化与打印操作。那么问题来了我们可以看到Init() 与 showinfo() 两个函数并没有传入对象的参数那么函数是怎样分辨出应该对哪个对象进行操作呢
C中通过引入this指针解决该问题 C编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有“成员变量”的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。 8.2 this指针的特性 1. this指针的类型类类型* const即成员函数中不能给this指针赋值。 2. 只能在“成员函数”的内部使用 3. this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给 this形参。所以对象中不存储this指针。 4. this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过寄存器自动传 递不需要用户传递 。 结语
都看到这里了奖励自己看个段子吧 欢迎大佬们指正