c++:类和对象知识点详解

目录

 

类引入

类的定义

类成员的访问权限

类的作用域

类的实例化

类对象

this指针



类引入

在c语言中“数据”和“处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”的关联性。

在c++中,结构体不仅可以定义变量,也可以定义函数。

类的定义

类是一种用户自定义的数据类型,用于组织数据和操作数据。类是面向对象程序设计的基础。

定义类的格式一般如下:

//类声明
class   类名
{
private:
	  私有数据成员和成员函数;
protected:
      保护数据成员和成员函数;
public:
	   公有数据成员和成员函数;

};
//类实现
静态数据成员初始化;
各个成员函数的定义;

class{  }  成为类声明,类声明仅告诉编译器有一个指定名称的类,它具有那些数据成员,那些成员函数并没有为其分配内存空间。

后面部分称为类实现,当遇见类实现时c++编译器会为静态数据成员分配内存空间并初始化。但不会为其他数据的成员分配内存空间,同时会为成员函数分配代码空间,这样每一个成员函数都会有一个存储器代码的地址。

类声明和类实现统称为类定义

类的定义通常分两种:

1:声明定义都在类体中

2:类的声明在.h文件中,类的定义在.cpp中

在进行大型项目时通常将类的声明与实现分离,这样可以是整个程序更加清新,提高变成效率。

类成员的访问权限

成员访问限定符,用于设置类成员的访问权限

  1. private:声明私有成员,私有数据成员只允许在类中访问,私有成员函数值允许被类中的其他成员函数调用。在类外不允许访问私有成员,也不允许调用私有成员函数。
  2. pubilc:声明公有成员,公有数据成员允许在类中或类外访问,公有成员函数允许在类中或类外调用
  3. protected:声明保护成员,保护的数据成员只允许在类中或其子类中访问,保护的成员函数允许在类中或其子类中调用。在类外不能访问该类的保护数据成员,也不能调用该类的保护成员函数

优点

1:信息隐蔽,及实现的封装,将类的内部和外部接口分开,这样使用该类的程序不需要了解类的详细实现

2:数据保护,及将类的重要信息保护起来,以免被不恰当的修改

说明:

  1. 在默认情况下,class一个类中的成员是私有的,struct为公有的
  2. 一旦给出看成员限定符,其后面的成员都是这个访问的权限,直到另一个成员限定符出现或类声明结束
  3. 一般来说,公有成员是类的对外接口,而私有的成员和保护的成员是类的内部实现的。
  4. c++没有规定声明访问限定符的顺序,可以以任意顺序进行声明

类的作用域

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

类的实例化

用类型创建对象的过程,成为类的实例化

1:类只是一个模型一样的东西,限定了类有那些成员,定义一个类并没有分配实际的内存空间来储存它

2:一个类可以实例化多个对象,实例化的对象占用实际的物理内存存储类的成员变量

类可以理解为房屋设计图,并没有实体存在

类对象

类对象的存储空间分配方式:

1:一个类对象的分配空间中仅包含所有的非静态数据成员,并且按这些数据成员定义的顺序存放

2:一个类对象的大小为其所有非静态数据成员的类型大小之和普通成员函数与sizeof无关(类中有一个或多个虚函数时,由于要维护虚函数表,所以有一个虚函数表指针,每个占用4字节)

3:类对象中的各个数据成员分配的内存空间时也遵守内存对齐的规则

类中的所有成员函数放在公共区(只保存一份)每个成员函数的代码有一个地址,成员函数的入口参数为对象地址。每个类的对象中只存放自己的数据成员和指向公共代码区对应成员函数的地址,也就是说类中的成员函数是共享的。

实际上,在某个对象的储存空间中不需要存放指向公共区中个成员函数的指针,而是在链接时调用成员函数的地方用成员函数的地址代替,因为调用函数的是其他代码,而不是该对象。

this指针

this是一个隐含于每一个类对象的特殊指针,该指针值是一个正在被某个成员函数操作的对象的地址

1:this类型:* const

2:this指针并不是对象的一部分,不影响sizeof的结果

3:this的作用域在类“成员函数”的内部

4:this指针是“非静态成员”的第一个默认隐含参数,编译器自动维护

5:只有在非静态成员函数中才能使用this指针,其它函数都不可以

6:静态成员函数没有this指针,因为类只有一个静态成员函数的副本,所以用this无意义,会引起编译错误

一个对象的this指针并不是对象本身的一部分,this的作用域在类的内部,当调用类的非静态成员函数时编译器会自动将对象本身的地址作为一个隐含的参数传递给该函数

链接:类的六个默认函数及相关知识点详解

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/82388972