Bootstrap

C++——类和对象(上)

1.类的定义

1.1 类定义格式

  • class为定义类的关键字,Stack为类的名字,{}中为类的主体,最后分号结尾。类体中内容称为类的成员:类中的变量称为类的属性成员变量;类中的函数称为类的方法或者成员函数
  • C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct中也可以定义函数,但一般推荐使用class。
  • inline表示为内部函数

1.2 访问限定符

  • C++一种实现封装的方式,用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
  • public修饰的成员在类外可以直接被访问的;protected和private修饰的成员在类外不能直接被访问,protected和private是一样的,之后继承部分才能看出区别。
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到},即类结束。、
  • class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
  • 一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

1.3 类域

        类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要用 ::作用域操作符指明成员属于哪个类域。

2. 实例化

  • 用类类型在物理内存中创建对象的过程,称为类实例化出对象。
  • 类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。
  • 一个类可以实例化出多个对象,实例化出的对象才会占用实际的物理空间(会存在内存对齐),来存储类成员变量。

3. this指针

  • 编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类类型的指针,叫做this指针。比如:void xxxx(Date* const this,xxx,xxx...){}
  • 类的成员函数中访问成员变量,本质都是通过this指针访问的。比如:其中的成员变量,在用的时候,其实是:this->xxx
  • C++规定不能再实参和形参的位置显示的写this指针,但是可以再函数体内显示使用this指针。

例题1:

下面程序运行结果:

A、编译错误   B、运行崩溃   C、正常运行

#include <iostream>

using namespace std;

class A 
{
public:
  void Print()
  {
    cout << "A::Print" << endl; 
  }
private:
  int _a;
};

int main()
{
  A* p = nullptr;
  p->Print();

  return 0;
}

例题2:

下面程序运行结果:

A、编译错误   B、运行崩溃   C、正常运行

#include <iostream>

using namespace std;

class A 
{
public:
  void Print()
  {
    cout << "A::Print" << endl; 
    cout << _a << endl;
  }
private:
  int _a;
};

int main()
{
  A* p = nullptr;
  p->Print();

  return 0;
}

因为p是一个指针,p->Print()相当于把p指针作为this参数传递进去。也就会存在:nullptr->_a的情况,这自然是错误的。第一题选C,第二题选B。

;