美文网首页
第2章 面向对象的C++

第2章 面向对象的C++

作者: 李伟13 | 来源:发表于2020-05-06 16:02 被阅读0次

:: 作用域限定符 / 作用域运算符
对象的声明方式

class   类名   对象名
类名   对象名

写代码时要注意

  • 限制访问权限
  • 将接口与实现分离

一般将类的声明放在指定头文件中,将类成员函数放在另一个文件中

student.h中的代码
class CStudent {
public :
  void display() ;
private :
  int num; 
  char name[20] ; .
  int age;
};

student.cpp中的代码
#include<iostream>
#include "student.h"    //这里需要include这个头文件,否则无法找到Student类
using namespace std;
void CStudent: :display() {  //这里要注明是Student类的
  cout<< "num: "<<num<<endl ;
  cout<< "name: "<<name<<end1 ;
  cout<<"age: "<<age<<endl ;
}

main.cpp中的代码
#include<iostream>
#include "student.h"  //注意这里是双引号
int main() {
  CStudent stu1;  //定义stul对象
  stu1.display();  //指向stul对象的成员函数
  return 0;
}

感觉和大二的时候写的stm32很像hhh,虽然当时没有用到类,是函数接口与实现的分离.


构造函数

  • 构造函数的重载
class Rectangle {
public:
  Rectangle();
  Rectangle(int h, int w):height(h), width(w) {}    构造函数的重载
  int square(int h, int w){}
private:
  int height, width;
}
Rectangle(int h = 5, int w = 4);    在声明构造函数时指定默认参数
  • 若在声明是指定默认参数了,在定义时可以不用指定默认参数了(如果声明和定义不在一块的话)
  • 若指定了全部的默认参数,就不能再定义重载的构造函数了


析构函数

1.如果在函数中定义了一个对象,当这个函数调用结束时,对象会被释放,且在对象
释放前会自动执行析构函数。

2.static局部对象在丽数调用结束时对象不释放,所以也不执行析构函数,只有在
main函数结束或调用exit 函数结束程序时,才调用static局部对象的析构函数。

3.全局对象则是在程序流程离开其作用域(如main函数结束或调用exit函数)时,才
会执行该全局对象的析构函数。

4.用new建立的对象,用delete释放该对象时,会调用该对象的析构函数。

类的静态成员

  • 所有该类对象的静态数据成员都有单一存储空间
  • 静态数据成员必须在类外定义与初始化
  • C++静态数据成员被该类的所有对象共享,包括派生类的对象
  • 静态和常量有区别
静态成员函数

在类中声明函数前加static 关键字为静态成员函数

static int volume();
  • 静态成员函数是类的一部分,而非对象的一部分.
Box::volume();

Box a;
a.volume();    用了a的类型而并不表示函数属于对象a

可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,
而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。

拓展参考

https://zhuanlan.zhihu.com/p/104193620
https://blog.csdn.net/majianfei1023/article/details/45290467

  • 如果对同一个类定义了是个对象,这些对象的成员函数对应同一个函数代码段
  • this指针在成员函数中.哪个对象调用,就把哪个对象的起始地址赋给this.

this指针的特点
(1)只能在成员函数中使用,在全局函数、静态成员函数中都不能使用this。
(2)this指针是在成员函数的开始前构造,并在成员函数的结束后清除。
(3) this 指针会因编译器不同而有不同的存储位置,可能是栈、寄存器或全局变量。
(4) this是类的指针。
(5)因为this指针只有在成员函数中才有定义,所以获得-一个对象后,不能通过对象使
用this指针,所以也就无法知道一一个对象的this指针的位置。不过,可以在成员函数中指定
this指针的位置。
(6)普通的类函数(不论是非静态成员函数,还是静态成员函数)都不会创建一-个函数
表来保存函数指针,只有虚函数才会被放到函数表中。

类模板

template <class 类型参数名>

析构函数和构造函数的执行顺序

定义两个对象,先定义的对象后调用析构函数.
(1)在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用。但如果- -个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。
(2)如果定义的是局部自动对象(如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。
(3)如果在函数中定义静态(static)局部对象,则只在程序第一次 调用此函数建立对象时调用构造函数一次, 在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。例如,在-一个函数中定义了以下两个对象:

继承与派生


越来越严格的访问属性

相关文章

网友评论

      本文标题:第2章 面向对象的C++

      本文链接:https://www.haomeiwen.com/subject/ezwightx.html