本篇主要学习总结
C++
类的相关知识,希望可以帮助到大家,如果错误,还望大佬不吝赐教。
与C的区别
- C是面向过程编程,关注解决问题的步骤,通过函数的逐步调用解决实际问题;C++是面向对象编程,将一件事情拆分为不同的对象,靠对象之间的交互完成。
- 语法差异:C++在C语言的基础上增加了一些新的语法元素,如类、对象、继承、多态等。这使得C++在编程时更加灵活和强大。
- 性能差异:由于C++是C语言的扩展,因此在性能上两者相差无几。在大多数情况下,C++程序的性能与C语言程序相当。
- 应用领域:C语言通常用于底层系统开发、嵌入式系统、游戏开发等领域,而C++则广泛应用于各种大型软件系统、网络编程、图形界面开发等领域。
一、基本知识
-
定义
类似于C中的结构体类型,二者都是用户自定义的复合数据类型。但C++中的类拥有成员函数,还具有继承、访问控制等特性。
定义:
// class为类的关键字,classname是这几行代码定义出类的名。
class classname
{
// 类的内部
public:
// 公共区间
private:
// 私有区间
};
其中public与private访问标号分别标识了公共空间和私有空间,在 public 部分定义的成员可被使用该类型的所有代码访问;在 private 部分定义的成员可被其他类成员访问。
通俗来说,private:好比一个人的身体与四肢,未经允许的情况下,只有自己可以调用;
public:好比一个人的工作,比如程序员,老板让程序员写代码,写代码就是程序员的一个功能,并且是public 的,可以被老板调用,但是程序员写代码的时候要用到自己private的东西,比如两只手;
-
作用域
类的所有成员都在类的作用域中,在类外定义成员时,需要使用
::
限定符指明成员属于哪个类域。因而,类的定义方式也会因为作用域的存在,有两种不同的定义方式:
- 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
- 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
-
类的实例化
用类型创建对象的过程,就是类的实例化。
类就好像图纸,对象就是使用此图纸设计出来的房子,虽然图纸设计出了房子,但图纸本身并不会导致实体建筑的存在。
一张图纸可以设计出多个房子,同理,一个类也可以实例化出多个对象;
二、类的小知识
1、类对象的大小计算
- 类实例化出的对象占用空间大小与成员函数无关,只取决于成员变量的大小;
- 成员变量在类的public与private部分均须参与大小的计算,简言之,类内部的成员变量,均须参与对象大小的计算;
- 类对象大小的计算遵循内存对齐原则;
举个例子:
class A
{
public:
void func1(); //函数不参与计算
// char _e;
int _d;
char _e;
private:
void func2() //函数不参与计算
{
int a = 1;
int b = 3;
};
char _a;
int _b;
int _c;
};
遵循内存对齐原则:最大对齐数为:4(所有变量类型最大者与默认对齐参数取最小,VS默认对齐数为8);
当_e在_d后时,由于内存对齐,_e与_a会连续放置,所以占用空间为16;
当_e在_d前时,由于内存对齐,后续三个空间会被闲置,所以占用空间为20;
如下:
2、this指针
C++Primer介绍:this指针为成员函数的隐式形参。this 指针指向调用该函数的对象,是指向类类型的指针。在 const 成员函数中,该指针也指向 const 对象。
-
**每个成员函数都有一个额外的、隐含的形参 this。**在调用成员函数时,形参 this 初始化为调用函数的对象的地址。
举例来说:
void Date::Print() const { cout << _year << " " << _month << " " << _day << endl; } void Date::Print1() const { cout << this->_year << " " << this->_month << " " << this->_day << endl; }
上述代码中,Print()与Print1()的功能是完全一样的;
-
this指针的类型:类类型 const*,即成员函数中,不能给this指针赋值;
this总是指向现在的对象,不可修改;也就是说,this指针是一个常量指针, 其中保存的地址不可被修改。
当在上述Print1中,加入一行代码,我们可以打印出d1的地址,但其实,地址也就是d1这个对象的地址,如下:
void Date::Print1() const { cout << this << endl; cout << this->_year << " " << this->_month << " " << this->_day << endl; }
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this,所以对象中不存储this指针。