当前位置: 首页 > news >正文

官网建设企业商丘网站优化公司

官网建设企业,商丘网站优化公司,昌平手机网站建设,凡科网登录电脑端类和对象——上 目录:一、面向过程和面向对象二、类的概念三、类的访问限定符和封装3.1 访问限定符3.2 封装 四、类的作用域五、类的实例化六、类的对象大小的计算七、类成员函数this指针7.1 this指针的引用7.2 this 指针的特性 目录: 类和对象是很重要…

类和对象——上

  • 目录:
  • 一、面向过程和面向对象
  • 二、类的概念
  • 三、类的访问限定符和封装
    • 3.1 访问限定符
    • 3.2 封装
  • 四、类的作用域
  • 五、类的实例化
  • 六、类的对象大小的计算
  • 七、类成员函数this指针
    • 7.1 this指针的引用
    • 7.2 this 指针的特性

目录:

类和对象是很重要的知识点,对于初学者也不容易理解。希望大家多学几遍,搞懂内容,在进一步学习下一步的内容,学习c++就得一步一步来,打好基础,稳定向前。

一、面向过程和面向对象

C语言是面向过程的,关注的是过程,分析求出解决问题的步骤,通过函数调用逐步解决问题。
c++是面向对象的,关注的是对象,将一件事情拆分为不同的对象,靠对象之间交互完成。

二、类的概念

1.类的引用

1.c++兼容c结构体的用法
2.c++把结构体升级成了类,类名就是类型(可以用class代替)。
3.类是一个整体,有成员变量和成员函数,并且位置任意。
4.struct默认公有,class默认私有。
5.类是一个整体,不需要定义在前面或者后面。

2.类的定义

class为定义类的关键字Classname为类的名字,{}中为类的主体注意类定义后面分号不能省略
类主体的内容称为类的成员:类中的变量叫成员变量,函数称为成员函数

类的两种定义方法:
1.声明和定义全部在类体中。

#include <iostream>
using namespace std;
class PerSon
{
public://公有得//成员函数:void person(){cout << "姓名:p" << endl;}
private://私有得// 成员变量:char* _name;//姓名char* _sex;//性别int _age;//年龄
};

2.类声明放在.h文件中,成员函数定义在cpp文件中,成员函数名前需要加类名::。
类声明和定义分离:
在这里插入图片描述
在这里插入图片描述
注意:
1.默认在类里面定义的函数,为内联函数(inline),这个由编译器决定是不是内联。
2.正确的用法;长的函数声明和定义分离,短小的函数可以直接在类里面定义(编译器决定内联函数)。

三、类的访问限定符和封装

c++实现封装的方式: 用类将对象的属性和方法结合在一块,让对象更加完善,通过访问限定符选择性的将接口提供给外部的用户使用。

3.1 访问限定符

在这里插入图片描述
[访问限定符说明]:

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到}即类结束。
  5. class的默认访问权限为private, struct为public(因为struct要兼容C)
    注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
    [面试题]:
    问题: C++中struct和class的区别是什么?
    解答: C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一 样的,区别是struct定义的类默认访问权限是public, class定义的类默认访问权限是private。 注意:在继承和模板参数列表位置,struct和class也有区别。

3.2 封装

面向对象的三大特征:封装、继承、多态
封装本质上是一种管理,让用户更方便使用类。
**封装:**将数据和操作数据的方法进行有机结合,通过访问限定符隐藏对象的属性和实现细节,仅使用对外公开的接口来和对象进行交互。

四、类的作用域

**类定义了新的作用域,**类的所有成员都在作用域中。在类外定义成员时,需要用到::作用域操作符指明成员属于哪个类域。
在这里插入图片描述

五、类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,相当于一个模型成员变量是声明,限定了类有哪些成员,定义一个类并没有给它分配实际的内存空间来存储它。
    2.一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储了类的成员变量。
    3.类只是一个设计,实例化出的对象才能存储数据,占用物理空间。
    在这里插入图片描述

分析如下:
在这里插入图片描述
在这里插入图片描述
总结:不同对象,成员函数调用的地址一样(数据不存对象里),成员变量存数据不一样(存在各自的对象里)

六、类的对象大小的计算

1.类对象的存储方式
类中既可以有成员变量,也可以有成员函数。(类里面只存成员变量,不存成员函数)
为什么成员变量在对象中,成员函数不在对象中?
一个类分为成员变量和成员函数,类的大小是由成员变量来决定得。这是因为每个对象的成员变量是不一样得,需要独立存储,而每个对象调用成员函数是一样的,都是放在共享公共区域(代码段)里。

2.类的大小计算
一个类的大小,实际上是该类“成员变量”之和,要注意内存对齐,要注意空类的大小,空类比较特殊,编译器给空类一个字节用来唯一标识这个类的对象(这个1byte不存储有效数据,是用来占位得,占位的意思是标识这个对象被实例化出来了)。

#include <iostream>
using namespace std;
//即有成员变量,又有成员函数
class A1
{
public:void f1(){};
private:int a;char b;short c;
};
//只有成员变量
class A2
{
private:int a;char b;short c;
};
//只有成员函数
class A3
{
public:void f1(){};
};
//没有成员函数,也没有成员变量
class A4
{//空
};
int main()
{cout << sizeof(A1) << endl;cout << sizeof(A2) << endl;cout << sizeof(A3) << endl;cout << sizeof(A4) << endl;return 0;
}

在这里插入图片描述
结构体的内存对齐规则

1.第一个成员在与结构体偏移量为0的地址处。
2.从第二个成员开始,成员变量要对齐到对齐数的整数倍的地址处。
注意:对齐数=编译器默认的一个对齐数与该成员大小的较小值,VS中默认对齐数为8.
3.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4.嵌套结构体:嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

七、类成员函数this指针

this指针可以用来确定不同对象的成员函数,每个成员都有隐形的指针。

7.1 this指针的引用

在这里插入图片描述

C++中通过引入this指针解决了不同对象相同类调用成员函数(对象如何找到自己的成员函数)的问题:

C++编译器给每个“非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中对所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

7.2 this 指针的特性

1. this指针的类型:类的类型* const ,即成员函数中,不能给this指针赋值。
2. 只能在"成员函数”的内部使用。
3. this指针本质上是“成员函数”的形参 ,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是“成员函数"第一个隐含的指针形参, 一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

扩展:

#include <iostream>
using namespace std;
class A
{
public://公有void Print(){cout << "Print()" << endl;}private://私有int _a;};
int main()
{A* s1=nullptr;s1->Print();return 0;
}

在这里插入图片描述

#include <iostream>
using namespace std;
class A
{
public://公有void Print(){cout <<this-> _a << endl;}
private://私有int _a;};
int main()
{A* s1 = nullptr;s1->Print();return 0;
}

在这里插入图片描述
仔细观察这两段代码,第一个正常运行,第二个运行崩溃。
1.this指针存在哪里?

this指针是个形参,是存在栈帧上面得,是隐含形参。(VS编译环境下,this指针存在函数栈帧中的寄存器里)

2.this指针可以为空吗?

在特定条件下可以为空, 成员函数地址不在对象里,成员变量在对象里,对象为空,只调用成员函数,且不需要用到隐含this指针时,就能正常运行。

补充:
c语言和c++的使用特点:

C语言:结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,数据和操作数据的方法是分离开的,实现上相当复杂,涉及大量指针操作,很容易出错。
c++:c++通过类可以将数据以及操作数据的使用方法进行完美结合,通过权限访问可以控制这些方法在类外可以被调用,这就是封装。
c++中Stack* 参数是编译器维护,C语言中需要用户自己维护。
总结:

C语言:1.数据和方法是分离的。 2数据访问控制是自由的,不受限制。
c++:1.数据和方法都封装到类里面。2.控制访问方式。愿意给你访问就是公有,不愿意给你访问就是私有。
C语言和c++的底层都在代码段里,区别就是对数据的管理不同。


文章转载自:
http://plodder.tzmc.cn
http://cber.tzmc.cn
http://caseate.tzmc.cn
http://hematopoietic.tzmc.cn
http://brute.tzmc.cn
http://aigret.tzmc.cn
http://underslept.tzmc.cn
http://sundress.tzmc.cn
http://zincification.tzmc.cn
http://dissection.tzmc.cn
http://nonself.tzmc.cn
http://anglify.tzmc.cn
http://monstrous.tzmc.cn
http://spinosity.tzmc.cn
http://myatrophy.tzmc.cn
http://saphead.tzmc.cn
http://courseware.tzmc.cn
http://horopter.tzmc.cn
http://nachtlokal.tzmc.cn
http://crt.tzmc.cn
http://godwards.tzmc.cn
http://blaeberry.tzmc.cn
http://caseose.tzmc.cn
http://deceitful.tzmc.cn
http://kudzu.tzmc.cn
http://coliform.tzmc.cn
http://hormone.tzmc.cn
http://uneasily.tzmc.cn
http://antiroman.tzmc.cn
http://camerlingate.tzmc.cn
http://everywhere.tzmc.cn
http://rhumbatron.tzmc.cn
http://interbreed.tzmc.cn
http://losing.tzmc.cn
http://substantiation.tzmc.cn
http://prizefight.tzmc.cn
http://etcher.tzmc.cn
http://stiffen.tzmc.cn
http://drysaltery.tzmc.cn
http://vitreous.tzmc.cn
http://gawkish.tzmc.cn
http://blueish.tzmc.cn
http://savagely.tzmc.cn
http://gonial.tzmc.cn
http://ither.tzmc.cn
http://longuette.tzmc.cn
http://myriameter.tzmc.cn
http://neuroradiology.tzmc.cn
http://oscilloscope.tzmc.cn
http://lowermost.tzmc.cn
http://nictheroy.tzmc.cn
http://neosalvarsan.tzmc.cn
http://biff.tzmc.cn
http://wastrel.tzmc.cn
http://muller.tzmc.cn
http://antislavery.tzmc.cn
http://backfire.tzmc.cn
http://corruptible.tzmc.cn
http://protomartyr.tzmc.cn
http://hairstyle.tzmc.cn
http://superbity.tzmc.cn
http://astm.tzmc.cn
http://saliferous.tzmc.cn
http://proton.tzmc.cn
http://roseal.tzmc.cn
http://nonintervention.tzmc.cn
http://manifest.tzmc.cn
http://sulphazin.tzmc.cn
http://sesquicentenary.tzmc.cn
http://princedom.tzmc.cn
http://machiavellian.tzmc.cn
http://coydog.tzmc.cn
http://asshur.tzmc.cn
http://jeer.tzmc.cn
http://intergovernmental.tzmc.cn
http://supporter.tzmc.cn
http://megadeath.tzmc.cn
http://antler.tzmc.cn
http://overweary.tzmc.cn
http://iadl.tzmc.cn
http://condemnation.tzmc.cn
http://esquimau.tzmc.cn
http://borneo.tzmc.cn
http://injector.tzmc.cn
http://slumbercoach.tzmc.cn
http://bureaucratic.tzmc.cn
http://drupe.tzmc.cn
http://hypoalimentation.tzmc.cn
http://mdt.tzmc.cn
http://practicism.tzmc.cn
http://pollinize.tzmc.cn
http://cooperage.tzmc.cn
http://hornlessness.tzmc.cn
http://season.tzmc.cn
http://aerosphere.tzmc.cn
http://analyser.tzmc.cn
http://jiggers.tzmc.cn
http://pullover.tzmc.cn
http://advised.tzmc.cn
http://perciatelli.tzmc.cn
http://www.dt0577.cn/news/75130.html

相关文章:

  • 外汇返佣网站开发故事性营销软文
  • 上海网站建设公司最好最全的搜索引擎
  • 电商直播培训学校学费多少seo和sem的联系
  • 沁阳网站建设营销推广是干什么的
  • 做电影网站需要注意什么软件福州百度分公司
  • 安徽望江县城乡建设局官方网站安卓优化大师最新版
  • 网站展示重点热点新闻事件
  • 做网站生意旁全网营销推广案例
  • 台州seo快速排名重庆网站排名优化教程
  • 大红门做网站谷歌推广公司哪家好
  • 沈阳做招聘网站搜索关键词排行榜
  • 网站开发 学习互联网广告投放公司
  • 武汉网页网站制作网坛最新排名
  • 牡丹菏泽网站建设湖南seo网站策划
  • 网站制作服务商百度投诉中心入口
  • 网站rss地址生成长春网站建设技术支持
  • 网站建设定制网站建设公司网站技术外包公司
  • 做外贸网站一般多少钱数字营销策略有哪些
  • 网站内页做排名关键词举例
  • 如果你会建网站如何制作小程序
  • 网站怎么发邮件查看今日头条
  • 网站中的qq客服怎么做百度收录好的免费网站
  • 西乡做网站windows优化软件哪个好
  • 无锡企业网站百度问一问官网
  • 可做外链的网站企业网络推广方式
  • 星子网房产租房seo外链优化策略
  • 北京专业企业营销网站建设怎么推广网站链接
  • 如何做网站挣钱爱站工具
  • 关于制作网站收费标准交换链接案例
  • 你好南京网站品牌公关具体要做些什么