概述
一、类的概念
在C语言中,“数据”和“函数”是分开的,为了支持“数据和函数”的关联性,C++里引入类,让所有的数据有一组“分布在各个以功能为导向的函数中”,它们处理的是共同的外部数据。类的关键字是class。
class className
{
//类体:由函数和变量组成
};
- class为定义类的关键字
- className为类的名字
- {}为类的主体
- 类中的数据称为类的属性或者类的成员变量
类中的函数称为类的方法或者类的成员函数
注意:类定义结束时后面有分号
C语言和C++中struct的区别
C语言中的结构体里不可以定义函数,而C++里可以定义函数。C++里之所以保留结构体,目的是为了兼容C语言。
C++中struct和class的区别
C++中struct默认成员权限为public,而class中默认为private,在C++中定义结构体,更喜欢用class来定义。
二、封装
函数是封装的一种形式,函数中的语句被封装在函数本身这个更大的实体,被封装的实体对外隐藏了具体实现细节,可以调用该函数但不能够访问函数中的语句。
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。
三、类的访问限定符
- public
public成员在类外可以直接访问。 - protected
protected不可以在类外直接访问,和private类似 - private
private成员也不可以在类外直接访问
private和protected的区别:pivate和protected都是对类的限制,限制访问类中属性的访问权限,区别在于private只能自己用,别的类都不能使用,protected在于其他派生类都可以使用,派生类就是指子类。
**注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
如何在类外访问一个类中私有成员变量:可以在类里定义一个公有的函数,类外通过这个函数接口访问该类中私有成员变量。
四、类作用域
类定义了一个新的作用域,类的所有成员都必须在类的作用域中。在类外定义成员,需要使用::作用域解析符指明成员属于那个类域。在类的作用域中,只能通过对象(或指针)借助成员访问操作符.和->来访问类成员。跟在访问操作符后面的名字必须在相关联类的作用域中。
注意:成员变量在类中具有全局作用域
五、类的实例化
- 用类类型创建对象的过程,称为类的实例化。
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有实际分配内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
六、类的对象模型
类对象模型:类中各成员在内存中的布局形式。
#include <iostream>
using namespace std;
class Person
{
public:
void SetPersonInfo(const char* name, const cha
r* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
private:
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Person p1,p2,p3;
p1.SetPersonInfo("熊大", "公", 5);
p2.SetPersonInfo("熊二", "母", 5);
p3.SetPersonInfo("Peter", "男", 18);
p1.PrintPersonInfo();
p2.PrintPersonInfo();
p3.PrintPersonInfo();
return 0;
}
存储方式一:
缺陷:每个对象中成员变量是不同的,但是函数都是相同的,如果一个类创建多个对象,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。
存储方式二:
方式二比方式一明显节省空间,但每个对象中还是多了一个指针。
存储方式三:
计算机到底按那中方式存储的,我们来看一个例子:
// 类中既有成员变量,又有成员函数
class A1
{
public:
void f1()
{}
void f2()
{}
private:
int _a;
};
// 类中仅有成员函数
class A2
{
public:
void f1()
{}
void f2()
{}
};
// 类中什么都没有---空类
class A3
{};
- sizeof(A1) :4
- sizeof(A2) :1
- sizeof(A1) :1
我们看到计算机是按照方式3进行存储的,那它是怎样找到成员函数的呢,我们在this指针那块在进行具体分析。
七、类的存储
类的存储方式:一个类的大小,实际就是该类中“成员变量”之和,当然也要进行内存对齐,注意空类的大小。(暂时不讨论虚函数)
C++中空类/空结构体的大小:空类的大小为1,为什么不是0呢,是因为空类被编译器插进去的一个char,使得这个class的不同实体(object)在内存中配置独一无二的地址。也就是说这个char是用来标识类的不同对象的 。
VS2013下,C语言不允许定义空的结构体
最后
以上就是腼腆未来为你收集整理的【C++学习笔记】类的全部内容,希望文章能够帮你解决【C++学习笔记】类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复