在C语言中,想要解决一个过程,我们编写程序,将是解决问题的完整过程翻译成计算机语言,让计算机去执行,关注的是过程,分析出求解问题的步骤。而在C++中,引入了类和对象的概念,将一件事情拆分成不同的对象,靠对象之间的交互完成。
一、类的定义
类的是C语言中结构体的升级版,它既可以定义成员变量,也可以定义成员函数。
类的定义:
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
二、类的访问限定符
访问限定符有三种:
public(公有)、protected(保护)、privacy(私有)。
特点:
- 1. public修饰的成员在类外可以直接被访问;
- 2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的);
- 3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
- 4. 如果后面没有访问限定符,作用域就到 } 即类结束。;
- 5. class的默认访问权限为private,struct为public(因为struct要兼容C)。
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
三、C++中结构体和类的区别
C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。
注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。
访问限定符的优势:1.使代码的使用更规范,只能使用规范的方式进行访问。C++一般将函数的权限设为公有,成员变量设为私有。
四、类域
每一个类都定义了一个类域,它与命名空间类似,同名成员可以分别定义在不同的类域中。
class A
{
public:
void Init();
private:
int a;
int b;
};
class B
{
public:
void Init();
private:
int a;
int b;
};
在定义函数时,需要加上类的作用域限定符。
void A::Init()
{
//...
}
void B::Init()
{
//...
}
不加访问限定符编译器就认为它是一个全局函数,加上访问限定符之后编译器就知道了这个函数来自A类,下面的Init函数来自B这个类。
五、类的实例化
在C++中,使用类创建对象叫类的实例化,一个类可以实例化出多个对象。
class A
{
public:
void Init();
private:
int a;
int b;
};
int main()
{
A a;
A b;
A c;//a,b,c都是实例化出的对象。
}
六、类的大小计算
我们使用sizeof关键字计算类的大小,也可以计算实例化对象的大小,二者是一样的。我们会发现类的大小只等于成员变量的大小,不会计算成员函数的大小,因为成员函数是公共的,每一个实例化对象都可以访问它,从而将它放在一个公共的区域,每一个对象都存成员函数就会导致浪费。而每个实例化对象的成员变量都不同,需要存储不同的值,因此只计算成员变量的大小。
空类的大小为1.,这1个字节不存储有效数字,表示对象被定义出来。若对象中只有一个成员函数,它的大小也为1,即类的大小只考虑成员变量
七、this指针
先来看一段代码:
class A
{
public:
void Init(int a,int b)
{
_a = a;
_b = b;
}
void Print()
{
cout << _a << ' ' << _b << endl;
}
private:
int _a;
int _b;
};
int main()
{
A a;
A b;
a.Init(5, 6);
b.Init(7, 8);
a.Print();
b.Print();
}
我们先实例化了两个对象a和b,然后每个对象分调用初始化和打印函数,结果如图所示:
它们调用的是一个函数,那么却打印出了不同的结果,那它是如何传参的呢?编译器会将对象的地址传给函数,实参是对象的地址,型参事this指针,然后this指针就访问每个对象的成员变量