C++ 类

  • 类和结构体的异同:结构体中成员默认为public,而class默认为private。
  • 在类外定义成员函数(一般多于3行的函数):void Student::display() {...};而::display()或者display()表示全局函数。this指针指向当前对象。
  • inline函数:如果类体中不包括循环等控制结构,C++系统自动将他们作为内置函数来处理。

  • 带参数的构造函数:Box::Box(int h, int w, int len):height(h),width(w),lenght(len) {}
  • 带默认参数的构造函数:Box::Box(int h=10, int w=10, int len=10); Box::Box(int h, int w, int len) {...}
  • 带有 const 数据的构造函数:test(const string str):: testStr(str) {}
  • 如果用户没有定义构造函数,系统自动生成一个无参数的空构造函数。
  • 例:
    • Box box1;  // 调用默认无参数或者全部参数制定默认值的构造函数    
    • Box box2(10, 20, 30);  // 调用带参数的构造函数
  • 复制构造函数:Box(Box &) 或者Box(const Box &),使用的三种情况
    • 一个对象去初始化另一个对象
    • 当某个函数的参数是类的对象,调用该函数时会调用对应类的复制构造函数
    • 如果某个函数的返回值是类的对象,调用该函数时会调用对应类的复制构造函数

  • 析构函数:当对象的生命期结束时,会自动执行析构函数。先构造的后析构,相当于一个栈,先进后出。
  • 析构函数调用说明:
    • (1) 在全局范围内中定义的对象在main函数执行完毕或者调用exit函数时,调用析构函数
    • (2) 函数中局部对象是在函数结束调用析构函数
    • (3) 静态(static)局部对象,在函数第一次被使用时析构一次,在main函数结束或者调用exit函数结束程序,才调用构造函数。

  • 对象数组初始化:
    • Student Stu[3] = {{101, 17, 87}, {102, 18, 88}, {103, 19, 89}};  // 同样调用构造函数赋值
    • Student Stu[3] = {Student(101, 17, 87),Student(102, 18, 88),Student(103, 19, 89)};

  • 指向对象成员的指针:
    • 由于成员函数是类的一个成员,所以指向成员函数的指针也应该是属于对应的类,而不是某个对象。
    • 定义指向成员函数的指针形式:函数返回值类型 (类名::*指针变量名) (参数列表)
    • 使指针指向一个公用成员函数:指针变量 =& 类名::成员函数名
    • 例如:
      • void(Time::*p)();p=&Time::get_time;(尽量不要省略&) 而不是 p=&t1.get_time; 成员函数不存放在对象的空间中,而是存放在对象外的空间中。
      • 调用指向成员函数的指针:(t1.*p3)();

  • 共用数据的保护
    • 1. 常对象: 类名 const/const 类名 对象名([实参表]),
      • 例如:const Time/Time const t1(11,12,13);  // 如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数
    • 2. 如果非要修改在常对象中的某个数据成员的值,用mutable来声明该变量:mutable int count;
    • 3. 常对象成员:const int hour;  
      • Time::Time(int h) {hour=h}//非法;  
      • Time::Time(int h):hour(h) {}//通过参数初始化方式

  • 指向对象的常指针:
    • Time * const ptrl = &t1;    // 声明的时候同时初始化
  • 指向常对象的指针:char c1 = "a";  const char *ptrl = &c1;  *p = 'b'; // 错误;c='b';//可行  
    • 如果希望任何情况都不改变c1的值,则将c1定义为const char c1='a';
    • 指向常对象的指针本身可以改变的,如const Time *p = &t1;  p=&t2; 只是p不能改变对象的值。
    • const char str[] = "Hello";  void fun(char *ptr);  fun(str);  // 访问非法,实参是const变量的地址
      • 函数形参为非const型变量的指针只能指向非const指针

  • 对象的动态建立和释放
    • Box *pt = new Box(11,22,33);    delete pt;
  • 对象的赋值(对已经存在的对象):Box box1, box2; box1 = box2;  
  • 对象的拷贝/复制(从无到有建立新的对象):Box box1(box2) 或者 Box box1=box2; // 调用复制构造函数 copy constructor, 未定义时系统会自动生成一个

  • 静态数据成员:
    • 不属于某个对象,在所有对象之外单独开辟空间。
    • 只能在类体外进行初始化:int Box::height = 10; 通过对象名或者类名引用静态数据成员:box1.height或者Box::height;
  • 静态成员函数
    • 没有this指针,所以它不能访问本类中的非静态成员。同理,使用对象名或者类名进行引用:box1.volume()或者Box::volume();
    • 尽可能只用静态成员函数引用静态数据而不引用非静态数据成员

  • 友元:
    • 1. 普通函数声明为友元函数: friend void display(Time &) //放在Time的公共函数中
    • 2. 友元成员函数:类与类之间,需要提前引用声明。P303
    • 3. 友元类:在类A中声明类B为其友元类,friend B;   // B类中的所有函数都是A类的友元函数,可以访问A的所有成员

  • 类模板:
    • 1. 声明:template <class numtype>   // 虚拟类型为numtype
    • 2. 调用需要用实际类型名去取代虚拟的类型:Compare <int> compl(4, 7)
    • 3. 如果类模板中的成员函数是在类模板之外定义:
      • template <class numtype> //先声明 numtype Compare <numtype>::max() {...}
  • 对象的周期:从它的构造结束开始,至它的析构开始为止。(如果构造函数中出现异常,那么这个对象就不存在)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值