C++名字查找

在学习C++一开始,我们就知道在使用类型、变量和函数时需要先定义。名字查找的过程比较直截了当:

  • 首先,在名字所在的块中寻找其声明语句,而且只找名字使用之前出现的声明
  • 如果没有找到,继续查找外层作用域,一样也必须在名字所在块之前出现的声明才被考虑
  • 如果最终没有找到匹配的声明,则程序报错

当然,对于定义在类内的成员函数中的名字与上述的查找规则有所区别,类的定义分两步处理:

  1. 首先,编译成员的声明
  2. 直到类全部可见后,才编译函数体。

成员函数中使用的名字按照如下方式解析:

  • 首先,在成员函数内查找该名字的声明,只有在名字使用前出现的声明才被考虑
  • 若成员函数内没找到该声明,则在类内继续查找;类内的所有成员都可以被考虑,不区分出现的前后顺序
  • 类内也没有,则按一般查找顺序,在外层作用域继续查找

例如下面代码:

#include <iostream>
using namespace std;

typedef double Money;
Money price = 10;

class Account
{
public:
    Money getPrice() const
    {
        return price;
    }

private:
    Money price = 20;

    typedef int Money;
};

int main()
{
    Account acc;
    cout << typeid(decltype(acc.getPrice())).name() << endl;
    cout << acc.getPrice() << endl;
}

输出结果为:

double
20

对于Account::price类型Money和Account::getPrice()返回值类型Money,在他们之前出现且离他们最近的是typedef double Money,所以类型是double。
而Account成员函数getPrice()中的price,最近的是类内的price。

再看一个代码:

#include <stdio.h>

class abc;
void del(abc *pobj)
{
    delete pobj;
}

// 下面的代码将会报错
/*
void del(abc *pobj)
{
	abc->show();
    delete pobj;
}
*/

class abc
{
public:
    abc()
    {
        printf("abc\r\n");
    }
    ~abc()
    {
        printf("~abc\r\n");
    }
    
    void show()
    {
        printf("this is abc\r\n");
    }
};

int main()
{
    abc *pobj = new abc;
    del(pobj);
}

输出:

abc

因为del中的参数abc是之前声明的abc,没有析构函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值