C++中class与struct

来源:互联网 发布:网络投影仪怎么用 编辑:程序博客网 时间:2024/06/07 02:09

       在C语言中,“数据”和“处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性。所有的数据由一组“分布在各个以功能为导向的函数中”的算法所驱动,它们处理的是共同的外部数据。类的引入在C++中,结构体中不仅仅可以存放数据,而且可以放置函数。

struct person{char *_name;char *_gender;unsigned char _age;void Print(){cout<<"name:"<<_name<<endl;cout<<"gender:"<<_gender<<endl;cout<<"age:"<<_age<<endl;}};

C++中,对于上面的定义形式,我们更喜欢使用关键字class来代替。

1、类的定义


类的两种定义方式:

a、直接在类声明时定义

b、声明和定义不在同一个文件中,一般将类的声明放在头文件中,将类的定义放在.cpp文件中,.h头文件和.cpp源文件的名字最好相同。我们更倾向于方式2。


2、类的访问限定符


它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。class的默认访问权限是private。



访问限定符表面上是给类编写者使用,永于提供对象与对象之间的交互,实际上是给编译器来使用的,因为数据在内存中存放时(不论是栈,堆或者全局作用域)是没有任何限制的,不可能说给某一段内存加上private或者protected限制。当编译器在对类进行编译时,对于不同访问限定符的成员,编译器就能确定哪些是可以在类外访问的,哪些是不能够在类外访问的。对于不能在类外访问的成员,使用者强行在类外访问时,编译器就会报错。

3、类的作用域


类定义了一个新的作用域,类的所有成员都必须处在类的作用域中。形参表和函数体处于类的作用域中。在类外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。在类的作用域外,只能通过对象或指针借助成员访问操作符 . 和->来访问类成员,跟在访问操作符后的名字必须在相关联类的作用域中。

成员变量在类中具有全局作用域。

4、类的说明

(1)类定义了一种新类型,是抽象出来描述实体的

(2)类将一组具有相关性数据包装在一起,这些数据成为类的成员变量或属性;类对自己的数据有特定的操作,这些操作成为类的成员函数或方法

(3)类定义了一种新的作用域,它可以选择性的将自己的成员提供给使用者(访问限定符)

(4)类中的任意一个成员都不能使用auto、extern、register修饰

(5)一个类可以有多个成员,类的成员函数可以重载

5、类实例化


类只是个模型一样的东西,限定了类有哪些成员,定义为一个类并没有分配实际的内存空间来存储它,一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。

类中的成员变量存储也遵循内存对齐原则。

C语言中struct与C++中struct的区别:

C是一种过程化的语言,struct只是 作为一种复杂数据类型定义,struct只能定义成员变量,不能定义成员函数。

struct还有构造函数和成员函数,其实它还拥有class的其他特性,例如继承、虚函数等。因此C++中的struct扩充了C的struct功能。事实上,C++中保留struct的关键字是为了使C++编译器能够兼容C开发的程序。

C++中struct与class的区别:

对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

关于结构体内存对齐:

(1)第一个成员在与结构体变量偏移量为0 的地址处

(2)其他成员变量要对齐到对齐数的整数倍的地址处(对齐数:编译器默认的对齐数与该成员所占字节数的较小值VS中默认为4,gcc中默认为4,可以通过预处理指令来改变)

(3)结构体总大小为最大对齐数的整数倍

(4)如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

结构体内存对齐是以空间换时间的做法。

对于一个空类对象(无成员变量的类)的大小,当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例,至于占用多少内存,取决于编译器,在VS平台下,它的大小为1字节。


0 0
原创粉丝点击