C++ 类知识点

时间:2023-03-08 19:01:04

  1. member function definitions are processed after the compiler processes all of the declarations in the class;

  2. our only chance to initialize const or reference data members is in the constructor initializer , also a class type that doesnot have a default constructor.

  3. 聚合类的概念 aggregate classes ,这里class的概念包含struct和union:

    a) 聚合类的所有成员数据都是public的;

    b) 聚合类不定义任何构造函数;

    c) 聚合类没有类内初始化;

    d) 聚合类没有基类或虚函数;

    C语言中的大部分结构体都可以看做是聚合类。

  4. literal class :

    a) 数据成员均是常量的聚合类被称为literal class

    b) 非聚合类只要满足如下条件也是literal class:

      数据成员都是常量类型;

      类必须至少有一个constexpr 构造器;

      必须使用类的默认的析构函数;

      如果数据成员有初始化器,此内置数据类型的初始化器必须是一个常量表达式;或者是成员是一个类,初始化器必须是成员函数自己的 constexpr 构造器;

  5. constexpr constructor

  6. 类的静态成员

    a) 静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值;

    b) 当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象               无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。

    c) 静态数据成员的用途之一是统计有多少个对象实际存在。

    d) 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的

    对像则静态数据成员都要被重新初始化。

    e) 对所有的对象是一样的。静态成员可以被初始化,但只能在类体外进行初始化。 注意:不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。

    (1)、static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。

    (2)、静态成员不能在类定义里边初始化,只能在class body外初始化。

    (3)、静态成员仍然遵循public,private,protected访问准则。

    (4)、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
#include "iostream"
using namespace std;
class test
{
private:
     int x;
     int y;
public:
     static int num;
     static int Getnum()
     {
          x+=5;   // 这行代码是错误的,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
          num+=15;
          return num;
     }
};
int test::num = 10;
int main(void)
{
     test a;
     cout<<test::num<<endl;        //10
     test::num = 20;
     cout<<test::num<<endl;        //20
     cout<<test::Getnum()<<endl;   //35
     cout<<a.Getnum()<<endl;       //50
     system("pause");
     return 0;
}

关于静态成员函数,可以总结为以下几点:

出现在类体外的函数定义不能指定关键字static;

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

非静态成员函数可以任意地访问静态成员函数和静态数据成员;

静态成员函数不能访问非静态成员函数和非静态数据成员;

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。

    引用自: http://www.jb51.net/article/41775.htm