cpp——类——声明 定义 实现

概述

类是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
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值