C语言类的基本语法详解
1、由C语言的结构体进入到C++中的类
我们在C语言中当需要定义多个变量的数据集合时,第一时间会想到使用结构体来进行定义,例如我们定义一个学生变量,包含姓名、年龄、性别等信息,代码示例如下:
struct Student{ char name[12]; int age; char sex[4]; };
但是到了C++用,由于C++面向对象的语法特性,给struct关键字进行了升级,不仅仅可以在struct中定义变量,还可以定义函数,也由此可利用struct来定义一个学生类。代码示例如下:
struct Student{ char name[12]; int age; char sex[4]; void show() { cout<<"姓名:"<<name<<endl; cout<<"年龄:"<<age<<endl; cout<<"性别:"<<sex<<endl; } };
如上所示在C++中利用struct关键字定义了一个学生类,因为C++是兼容C的,所以该类在使用时,可以当作Student结构体来使用,也可以当作Student类来使用,(一定是在C++中!!!)两种使用如下:
//作Student结构体来使用 struct Student strs; //作Student类来使用 Student clas;
2、C++中如何定义类?
C++中定义类的语法格式为class 类名;下面直接上代码示例:
class className { // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
3、C++中实例化一个对象
C++中对象的实例化可以理解成有一个类模具,根据这个类模具制造出来了许多与类中特性相同的产品。利用学生类实例学生对象,示例如下:
Student s1; Student s2; Student s3; //s1、s2、s3这些都是类的实例化对象,一个类可以实例化无限个对象 //并且这些对象都是不相关的。
4、C++类的访问限定及其封装 C++中的访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
C++中的访问限定符有public、private、protected
1、public修饰的成员在类外可以直接被访问
2、protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3、访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4、class的默认访问权限为private,struct为public(因为struct要兼容C)
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。(可以理解为被封装起来的数据只能在类中直接访问,在类外如果需要访问时,需要借助类中已经写好的函数来进行操作)对上面的学生类进行封装,代码示例如下:
class Student{ private: char name[12]; int age; char sex[4]; public: void show() { cout<<"姓名:"<<name<<endl; cout<<"年龄:"<<age<<endl; cout<<"性别:"<<sex<<endl; } };
5、C++中类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。如果要在类外实现类中声明的方法,要先进行::的操作,声明属于哪一个类。代码示例如下:
class Student{ private: char name[12]; int age; char sex[4]; public: void show(); }; void Student:: show { cout<<"姓名:"<<name<<endl; cout<<"年龄:"<<age<<endl; cout<<"性别:"<<sex<<endl; }
6、成员变量和方法在类中是如何存储的?
先来看一段代码:
class Student { private: char name[12]; int age; char sex[4]; public: void show(); }; int main() { Student s1; cout<<sizeof(s1)<<endl; return 0; }
结果如图所示:
为什么会是二十哪?show函数的存储不在类中吗?
正是如此!一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。而类中的方法都被放到类外的同一块空间,这样做是避免在实例化对象的时候,放在方法的重复定义开辟不必要的内存空间,造成空间浪费。