类的由来
在C语言中我们有自定义类型的struct,然而在C++中C++兼容C里面的用法,同时struct在C++中升级成了类。C++类和C语言中的结构体不同的是除了可以定义变量还可以定义方法/函数。例如:
#include<string>
#include<iostream>
using namespace std;
struct Student
{
//成员变量
char _name[10];
int _age;
int _id;
//成员方法
void Init(const char* name, int age, int id)
{
strcpy(_name, name);
_age = age;
_id = id;
}
void Print()
{
cout << _name << endl;
cout << _age << endl;
cout << _id << endl;
}
};
int main()
{
struct Student s1;//C中定义结构体的用法
Student s2;//c++定义类的用法 Student 既是类名也是类型
//strcpy(s1._name, "李四");
//s1._age = 10;
//s1._id = 0;
//strcpy(s2._name, "张三");
//s2._age = 20;
//s2._id = 1;
s1.Init("zhangsan",10,0);
s2.Init("李四" ,20 ,1);
s1.Print();
s2.Print();
return 0;
}
C++中更喜欢用class代替struct但是C++兼容C的用法
类的定义
class classname
{
//在这里定义/声明成员变量或成员函数
};
class为定义类的关键字,classname为类的名字,{}中为类的主体
类的特性
封装
面向对象的语言一般有三大特性:封装,继承,多态,其中类体现了封装的特性:
1、数据和方法都放到了一起
2、将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
3、封装的本质是一种管理
4、可以给用户访问的定义为公有,不可以进行访问的内容定义为私有。
访问限定符
一般在定义类的时候,建议明确定义访问限定符,不使用默认定义。那么什么是访问限定符呢?
访问限定符是用来规定类中成员性质的一种标识符,作用范围从一个访问限定符开始到下一个访问限定符或者到类结束,那么有哪些访问限定符呢?
1、public(公有):公有修饰的成员可以在类外面进行访问
2、protected(保护)和private(私有)修饰的成员不能在类外面进行访问
3、访问权限的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
4、class的默认访问权限为private(私有),struct的为public(公有)(为了兼容C)
class Student
{
private:
//成员变量
char _name[10];
int _age;
int _id;
public:
//成员方法
void Init(const char* name, int age, int id)
{
strcpy(_name, name);
_age = age;
_id = id;
}
void Print()
{
cout << _name << endl;
cout << _age << endl;
cout << _id << endl;
}
};
int main()
{
Student s1;
//s1._name;//报错 无法直接访问
return 0;
}
类的定义方法
声明和定义全部放在类体中
class Student
{
private:
//成员变量
char _name[10];
int _age;
int _id;
public:
//成员方法
void Init(const char* name, int age, int id)
{
strcpy(_name, name);
_age = age;
_id = id;
}
void Print()
{
cout << _name << endl;
cout << _age << endl;
cout << _id << endl;
}
};
声明放在.h文件中,类的定义放在.cpp文件中
class Student//头文件中
{
private:
//成员变量
char _name[10];
int _age;
int _id;
public:
//成员方法
void Init(const char* name, int age, int id);
void Print();
};
void Student::Print()//cpp文件中定义函数方法,需要使用 :: 作用域解析符指明成员属于哪个类域。
{
cout << _name << endl;
cout << _age << endl;
cout << _id << endl;
}
类对象的大小
class Student
{
private:
//成员变量
char _name[10];
int _age;
int _id;
public:
//成员方法
void Init(const char* name, int age, int id)
{
strcpy(_name, name);
_age = age;
_id = id;
}
void Print()
{
cout << _name << endl;
cout << _age << endl;
cout << _id << endl;
}
};
int main()
{
Student s1;
cout << sizeof(s1) << endl;//20
cout << sizeof(Student) << endl;//20
return 0;
}
一个类的大小,实际就是该类中”成员变量”之和(不计算成员函数大小),当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
内存对齐规则
1、第一个成员在与结构体偏移量为0的地址处。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数:编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
3、结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。、