C++类_声明、定义、实现

https://blog.csdn.net/mardax/article/details/54948173

概述
类是c++引入的核心数据类型,类是对数据和方法的封装,地位上与内置类型(复合类型)相同,只是一种自定义数据类型
声明
类的声明,又称类的前向声明,即forward declaration,告诉编译器class类型,但当前并不知道class具体细节,是不完全类型
类的声明只能用于指针(引用)类型,因为指针(引用)类型字长固定,编译器知道分配多少内存空间,如何操作指针(引用)类型
类的声明不能用于实例对象,因为对于实例对象,编译器需要知道class具体细节以便确定分配多少内存空间,如何操作实例对象
class CAnimal;
 
void incomplete_class(CAnimal* pAnimal, CAnimal& rAnimal)
{
    //CAnimal animal;
}
定义
类的定义本质是定义一个作用域,称为类作用域
类作用域中包含以下类成员:
non-static数据成员
non-static函数成员
static数据成员
static函数成员
从c角度理解类成员:
non-static数据成员:数据成员描述,描述数据成员相对于实例对象首地址的offset和数据成员自身字长,类似于c struct的数据成员,遵循内存对齐规则,属于this成员
non-static函数成员:函数声明,第1个参数为this隐含参数
static数据成员:全局数据对象声明,不属于this成员
static函数成员:函数声明,无this隐含参数
注:this参数类型为类的const指针对象,指向当前实例对象
class CAnimal
{
private:
    int group;
    
public:
    void init();
    
public:
    void setGroup(int group);
    int getGroup();
    
private:
    static int totalGroup;
    
public:
    static int getTotalGroup();
};
相当于定义了一个类作用域CAnimal:
CAnimal
{
    int group;
    
    void init(CAnimal* const this);
    void setGroup(CAnimal* const this, int group);
    int getGroup(CAnimal* const this);
    
    extern int totalGroup;
    
    int getTotalGroup();
}
注:只是助于理解,在c++语法中不可如此定义类作用域,也不可在所有类成员前加extern修饰
实现
类的实现是对类定义中的声明optional定义:
non-static数据成员:数据成员描述,类似于c struct数据成员,无需实现
non-static函数成员:函数声明,optional定义
static数据成员:数据对象声明,optional定义
static函数成员:函数声明,optional定义
注:对于non-static函数成员,static数据成员,static函数成员optional定义,如果确定不会被访问,可不定义,如果确定会被访问,必须定义,否则link error
void CAnimal::init()
{
    cout << "CAnimal::init()" << endl;
}
 
void CAnimal::setGroup(int group)
{
    cout << "CAnimal::setGroup(int)" << endl;
}
 
int CAnimal::getGroup()
{
    cout << "CAnimal::getGroup()" << endl;
    return group;
}
 
int CAnimal::totalGroup = 5;
 
int CAnimal::getTotalGroup()
{
    cout << "CAnimal::getTotalGroup()" << endl;
    return totalGroup;
}
注:类外定义static数据成员和static函数成员时不能加static修饰,类外部的static含义还原为c static含义
this&成员访问
this为const指针对象,指向当前实例对象,因此this的本质就是实例对象,non-static数据成员和non-static函数成员跟this相关联,而static数据成员和static函数成员跟this无关联,因此类成员遵循下面规则:
non-static数据成员属于实例对象成员,因此只能通过实例对象访问
non-static函数成员含this隐含参数,因此只能通过实例对象访问,实例对象地址传给this
static数据成员不属于实例对象成员,因此在实例对象中不占据内存空间,sizeof不包含static数据成员
static函数成员不属于实例对象成员,因为无this参数接收实例对象地址
static函数成员无this隐含参数,因此static函数作用域内无实例对象,因此static函数作用域内不能访问non-static数据成员和non-static函数成员(需关联this),static函数作用域内自然可访问static数据成员和static函数成员(无需关联this)
non-static函数成员含this隐含参数,因此non-static函数作用域内存在实例对象,因此non-static函数作用域内可访问non-static数据成员和non-static函数成员(需关联this),non-static函数作用域内自然可访问static数据成员和static函数成员(无需关联this)
允许类和实例对象访问static数据成员和static函数成员,但通过实例对象访问static数据成员和static函数成员意义仅止于类作用域,与通过类访问无区别,因为static数据成员和static函数成员跟this无关联,为了明确static含义,建议static数据成员和static函数成员通过类访问,不建议通过实例对象访问,否则易模糊static含义
void access_member()
{
    CAnimal animal;
    CAnimal* pAnimal = &animal;
    
    //CAnimal::init();
    animal.init();
    pAnimal->init();
    
    CAnimal::getTotalGroup();
    animal.getTotalGroup();
    pAnimal->getTotalGroup();
    
    cout << "sizeof(int) = " << sizeof(int) << endl;
    cout << "sizeof(CAnimal) = " << sizeof(CAnimal) << endl;
}
output:
CAnimal::init()
CAnimal::init()
CAnimal::getTotalGroup()
CAnimal::getTotalGroup()
CAnimal::getTotalGroup()
sizeof(int) = 4
sizeof(CAnimal) = 4

你可能感兴趣的:(C++)