本文共 3623 字,大约阅读时间需要 12 分钟。
我们都知道,在c语言中,结构体是指一系列相同类型或者不同类型的数据构成的数据集合。
在c语言中我们将结构体定义为:struct Student{ char name[20];//姓名 char gender[3];//性别 int age;//年龄};
而我们知道,在c语言中,“数据”和”处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性。所以在c语言的结构体中,只能存放数据,定义变量,而不能定义函数。(此处不考虑定义一个指向函数的指针)
而在c++中,结构体内不仅可以定义变量,还可以定义函数。
struct Student{ char _name[20]; char _gender[3]; int _age; void StudentInfo(const char* name, const char* gender, int age) { strcpy(_name, name); strcpy(_gender,gender); _age = age; }};int main(){ Student s; s.StudentInfo("小明","男",18); return 0;}
c语言中的struct与c++中的struct有什么区别
c语言中的struct只能保存数据,定义变量,不能定义函数 c++中的struct可以定义变量或者函数
而在c++中,结构体的定义更喜欢用class来代替,我们称之为“类”。
类
1.类的概念及封装
类的定义:
class className{ 类体 //由函数和变量组成};
说明: class是定义类的关键字;className是类名,{}内是类的主体;类定义结束时后面要加上分号。 类中的元素称为类的成员;类中的数据称之为类的属性或者类的成员变量;类中的函数称之为类的方法或者类的成员函数。
类的定义有两种方式:
1.类的声明和定义都放在类体中
class Test{public: Test() { cout << "Creat Test" << endl; } ~Test() { cout << "Destroy Test" << endl; }};
2.类的声明放在.h文件中,类的定义放在.cpp文件中
*Test.h*class Test{public: Test(); ~Test();};
*Test.cpp*Test::Test (){ cout << "Creat Test" << endl;}Test::~Test(){ cout << "Destroy Test" << endl;}
c++中struct和class的区别
关于默认访问权限: class默认成员访问权限为private;而struct默认成员访问权限为public关于继承方式:class继承默认为private;而struct继承默认为public继承class这个关键字还用于定义模板参数,就像typename。但关键字struct不用于定义模板参数。
封装:
c++的三种特征:封装,继承,多态
什么是封装:
隐藏对象的属性及实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。
第一层含义:封装是面向对象程序设计的基本属性。将数据和函数合为一体,这在计算机世界使用类和对象进行的。(把属性和方法进行封装)
第二层含义:把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象操作,对不可信的进行信息的隐藏。(对属性和方法进行访问控制)
示例:
1.就比如说电脑,在电脑中有主板,cpu,网卡,内存等等,但是所有复杂的结构外装上一个机箱的外衣,当用户使用电脑时,不用知道电脑其内部结构,只用通过键盘输入,即可完成自己想要的操作。
2.函数也是一种封装,函数中的语句被封装在函数这个更大的实体中,被封装的实体隐藏了它们的实现细节,可以调用函数,但是不能访问其内部。
类的意义:
类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。 类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。
类的作用域:
在c++中,我们已经学会了三种作用域–全局作用域,局部作用域,命名空间域,而类定义了一个新的作用域,类的所有成员必须处于类的作用域中。形参表和函数体位于类的作用域中。
{ }花括号以外称为类外,在类外定义成员必须使用”: :”作用域解析符指明成员属于哪一个类作用域;在类的作用域外,只能通过对象借助成员访问操作符“.”和”->”来访问类成员,跟在访问操作符之后的名字必须在相关联类的作用域里。
class Test{public: void Seta(int a ) { int _a = a; } void Printa() { cout << _a << endl; }private: int _a;};int main(){ Test t; t.Seta(10); t.Printa(); return 0;}
在此,我们已经学到了c++中的四种作用域—全局作用域,局部作用域,命名空间域以及类作用域。
注意:成员变量在类的作用域中具有全局作用性。
相关面试题:
在使用一个变量前,必须先对其声明,但是咋上述Test类中,成员变量在函数之后,为什么编译器不报错?
这和编译器对类的识别有关,在编译器识别类时,顺序如下:
(1)识别类的类名 (2)识别类中的成员变量 (3)识别类的成员函数,并且对成员函数进行修改 因此变量定义在使用之后编译器也不会报告出错。类的实例化:
用类类型创建对象的过程称之为类的实例化。
说明:
1.类知识一个相当于模型一样的东西,只是限定了类有哪些成员,定义一个类,并没有分配实际的内存空间来存储它。2.一个类可以实例化多个对象,实例化出来的对象占用实际的物理空间存储类成员变量。
对象:
类是对象的抽象,对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占有内存空间。
例如:类就是水果,对象就是苹果。
类的对象模型:
类的对象模型是指类中各成员在内存中的布局形式
类中既有成员变量,又有成员函数,那么如何计算类的大小呢?(严格来说是类的对象的大小,因为类是一个类型定义,没有大小可言)
class person{public: void SetpersonInfo(char* name,char*gender,int age) { strcpy(_name, name); strcpy(_gender, gender); _age = age; } void Printperson() { cout << _name << "" << _gender << "" << _age << endl; }private: char _name[20]; char _gender[3]; int _age;};int main(){ cout << sizeof(person) << endl; return 0;}
对于上述代码,其运行结果为:
结论:一个类的大小就是类中“成员变量”之和。对于一个空类,它的大小又是多少呢?
class Emptyclass{};int main(){ //cout << sizeof(Test) << endl; cout << sizeof(Emptyclass) << endl; return 0;}
运行结果:
故我们可知,空类的大小是1。(此处所说的是vs2013编译器下的结果,编译器不一样,空类大小不一样)原因:这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。
换句话说 C++编译器不允许对象为零长度。试想一个长度为0的对象在内存中怎么存放?怎么获取它的地址?为了避免这种情况,C++强制给这种类插入一个缺省成员,长度为1。如果有自定义的变量,变量将取代这个缺省成员。