专业网站建设官网,赵县网站建设,汉服网站设计目的,html5 公众号 网站开发#x1f4d4;个人主页#x1f4da;#xff1a;秋邱-CSDN博客☀️专属专栏✨#xff1a;C#x1f3c5;往期回顾#x1f3c6;#xff1a;从C语言过渡到C#x1f31f;其他专栏#x1f31f;#xff1a;C语言_秋邱
面向过程和面向对象
C 语言被认为是面向过程的编程… 个人主页秋邱-CSDN博客☀️专属专栏✨C往期回顾从C语言过渡到C其他专栏C语言_秋邱
面向过程和面向对象
C 语言被认为是面向过程的编程语言在面向过程的编程中重点在于程序功能的实现通过函数调用逐步解决问题。
C 是面向对象的编程强调的是将数据和对数据的操作封装在对象中通过类和对象的概念来组织程序结构实现数据的隐藏、继承和多态等特性。
类
定义
类是一种用户自定义的数据类型它将数据成员变量和操作这些数据的函数成员函数封装在一起形成一个逻辑上相关的单元。 class 类名 {访问修饰符:成员变量;成员函数;
}; 为了区分成员变量⼀般习惯上成员变量会加⼀个特殊标识如成员变量前⾯或者后⾯加_或者m 开头注意C中这个并不是强制的只是⼀些惯例具体看公司的要求。
C中struct也可以定义类C兼容C中struct的⽤法同时struct升级成了类明显的变化是 struct中可以定义函数⼀般情况下我们还是推荐⽤class定义类。
注意定义在类里面的成员函数默认为inline内联函数。
访问限定符
C 实现封装的方式 用类将对象的属性与方法结合在一块让对象更加完善通过访问权限选
择性的将其接口提供给外部的用户使用。
在C 中有有三种访问限定符public公共的private私人的protected受保护的。
public修饰的成员在类外可以直接被访问protected和private修饰的成员在类外不能直接被访 问protected和private是⼀样的访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌如果后⾯没有 访问限定符作⽤域就到}即类结束。class定义成员没有被访问限定符修饰时默认为private class Date
{
public://公开的void Init(int year 1, int month 1, int day 1){_year year;_month month;_day day;}
private://私有的int _year;int _month;int _day;
}; 拓展struct默认为public
在 C 语言中对于结构体内部指针指向自身类型需要使用 struct 关键字来标识就像代码 1 中struct List* next;这样。而在 C 中可以直接使用结构体的名称如代码 2 中的List* next; 。C 对结构体的处理方式更加灵活和方便在结构体内部引用自身类型时无需再重复使用 struct关键字。 //代码1c语言的写法
struct List
{int val;struct List* next;
};//代码2c的写法
struct List
{int val;List* next;
}; 作用域
类定义了⼀个新的作⽤域类的所有成员都在类的作⽤域中在类体外定义成员时需要使⽤::作 ⽤域操作符指明成员属于哪个类域。c常用的四个域局部域全局域命名空间域类域。 #includeiostream
using namespace std;
class Date
{
public://成员函数void Init(int year 1, int month 1, int day 1);
private://成员变量int _year;int _month;int _day;
};
//声明和定义分离需要指定类域
//这里是☞Date这个类域下的Init函数
void Date::Init(int year 1, int month 1, int day 1)
{_year year;_month month;_day day;
}
int main()
{Date d1;d1.Init();return 0;
} 实例化
⽤类类型在物理内存中创建对象的过程称为类实例化
类是对象进⾏⼀种抽象描述是⼀个模型⼀样的东西限定了类有哪些成员变量这些成员变量只是声明没有分配空间。⽤类实例化出对象时才会分配空间。⼀个类可以实例化出多个对象实例化出的对象占⽤实际的物理空间存储类成员变量。
就像建造一个房子之前需要设计图设计完之后才能将房子建造出来实例化可以将这个设计的房子。 int main()
{
//实例化出对象d1,d2,d3,d4Date d1;Date d2;Date d3;Date d4;return 0;
} 对象的大小
类和对象的内存对齐和struct几乎一模一样对齐规则
第⼀个成员在与结构体偏移量为0的地址处。其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处。注意对⻬数编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。结构体总⼤⼩为最⼤对⻬数所有变量类型最⼤者与默认对⻬参数取最⼩的整数倍。如果嵌套了结构体的情况嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处结构体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体的对⻬数的整数倍。
如果还不清楚可以看看之前写的C语言结构体 。 #includeiostream
using namespace std;
//含有成员函数和成员定义
class A
{
public:void print(){cout print() endl;}
private:char a1;int a2;
};
//含有成员函数
class B
{
public:void print(){cout print() endl;}
};
//无
class C
{};
//嵌套
class D
{
public:class E{int b;};
private:int a;
};
int main()
{A a;B b;C c;D d;cout sizeof(a) endl;cout sizeof(b) endl;cout sizeof(c) endl;cout sizeof(d) endl;return 0;
} c 上⾯的程序运⾏后我们看到没有成员变量的B和C类对象的⼤⼩是1为什么没有成员变量还要给1个 字节呢因为如果⼀个字节都不给怎么表⽰对象存在过呢所以这⾥给1字节纯粹是为了占位标识 对象存在。
类D中我们嵌套了E但是实际只有4个字节这是因为嵌套类E的成员变量并不直接包含在类的内存布局中。嵌套类是一个独立的类它的成员变量的存储与外部类是相互独立的。
this指针
QiuQiu类中Print函数和默认构造函数这两个成员中没有关于对象的区分可为什么在调用时却能够区分q1和请q2。其实这是C在类中给了一个隐含的this指针来解决这里的问题。
编译器编译后会在函数的第一个位置放置一个默认的成员函数叫做this指针且这个不需要我们手动去写。
C规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理)但是可以在函数体内显示使⽤this指针。 #includeiostream
using namespace std;
class QiuQiu
{
public://QiuQiu (QiuQiu* const this, int age, int height, int weight)QiuQiu (int age, int height, int weight){_age age;this-_height height;this-_weight weight;}//void Print(QiuQiu* const this) --q1 / q2void Print(){cout 年龄 _age 岁 endl;cout 身高 _height 厘米 endl;cout 体重 _weight 千克 endl endl;;}private:int _age;int _height;int _weight;
};
int main()
{QiuQiu q1(20,180,65);q1.Print();cout endl;QiuQiu q2 (15,170,55);q2.Print();return 0;
} 注意this指针跟普通指针一样都是放在栈区域上的。
小试牛刀
下⾯程序编译运⾏结果是
A、编译报错 B、运⾏崩溃 C、正常运⾏
#includeiostream
using namespace std;
class A
{
public:void Print(){cout A::Print() endl;}
private:int _a;
};
int main()
{A* p nullptr;p-Print();return 0;
} A*p nullptr将p的地址就是this指针而类中的成员函数放在公共代码段中只是被类所限制访问。虽然表面上失去解引用但printf这个成员函数在编译的时候地址就以及确定了之后只需要找到对应的函数即可实际上并没有解引用。
下⾯程序编译运⾏结果是
A、编译报错 B、运⾏崩溃 C、正常运⾏
#includeiostream
using namespace std;
class A
{
public:void Print(){cout A::Print() endl;cout _a endl;}
private:int _a;
};
int main()
{A* p nullptr;p-Print();return 0;
} _a存在对象里面p为空this指针也就为空对空指针进行解引用会产生运行奔溃。 文章转载自: http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.kndyz.cn.gov.cn.kndyz.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.ygth.cn.gov.cn.ygth.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.rcjqgy.com.gov.cn.rcjqgy.com http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.wjqbr.cn.gov.cn.wjqbr.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.dsncg.cn.gov.cn.dsncg.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.ghkgl.cn.gov.cn.ghkgl.cn http://www.morning.wanjia-sd.com.gov.cn.wanjia-sd.com http://www.morning.lxngn.cn.gov.cn.lxngn.cn http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn http://www.morning.rknjx.cn.gov.cn.rknjx.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.bcnsl.cn.gov.cn.bcnsl.cn http://www.morning.cpfbg.cn.gov.cn.cpfbg.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.tbnpn.cn.gov.cn.tbnpn.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn http://www.morning.madamli.com.gov.cn.madamli.com http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.lzph.cn.gov.cn.lzph.cn http://www.morning.kxqmh.cn.gov.cn.kxqmh.cn http://www.morning.mwns.cn.gov.cn.mwns.cn http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.fdsbs.cn.gov.cn.fdsbs.cn http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.sfrw.cn.gov.cn.sfrw.cn http://www.morning.llsrg.cn.gov.cn.llsrg.cn http://www.morning.c7630.cn.gov.cn.c7630.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.schwr.cn.gov.cn.schwr.cn http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.snkry.cn.gov.cn.snkry.cn http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn http://www.morning.rbcw.cn.gov.cn.rbcw.cn http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.dspqc.cn.gov.cn.dspqc.cn http://www.morning.hjwkq.cn.gov.cn.hjwkq.cn http://www.morning.nbybb.cn.gov.cn.nbybb.cn http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn http://www.morning.tdttz.cn.gov.cn.tdttz.cn http://www.morning.ykgkh.cn.gov.cn.ykgkh.cn http://www.morning.mcwgn.cn.gov.cn.mcwgn.cn http://www.morning.rqqlp.cn.gov.cn.rqqlp.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn http://www.morning.ogzjf.cn.gov.cn.ogzjf.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn http://www.morning.rqckh.cn.gov.cn.rqckh.cn http://www.morning.wmfh.cn.gov.cn.wmfh.cn http://www.morning.lnnc.cn.gov.cn.lnnc.cn http://www.morning.yppln.cn.gov.cn.yppln.cn