首页 > 编程语言 >类的作用域详解(C++ primer7.4笔记)

类的作用域详解(C++ primer7.4笔记)

时间:2022-11-02 21:46:44浏览次数:38  
标签:函数 作用域 Money C++ height 查找 primer7.4 bal

7.4 类的作用域

名字查找的过程:(查找匹配的声明)

  1. 在名字所在块中寻找语句,查找使用名字之前出现的声明。
  2. 如果没找到,查找外层作用域
  3. 还没找到就报错

类的定义分为两步处理:

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

成员函数中的名字查找:

  1. 首先在函数内查找该名字的声明
  2. 如果没在函数内找到,在类中所有的成员查找。
  3. 类内没有找到该名字的声明,则去上层的作用域查找。

编译器处理完类的全部声明之后才会处理成员函数的定义,所以它可以使用类中定义的任何名字。
类的声明中使用的其他名字包括返回值类型和参数列表使用的名字,都必须在使用前确保清晰可见。

typedef double Money;
string bal;
class Account {
    public:
        Money balance() {return bal; }
    private:
        Money bal;
}

这个例子中,编译器遇到Money后,会查找到typedef double Money;但在函数体内的bal使用的是Money bal;而不是string类型的bal。因为编译器处理完类的全部声明之后才会处理成员函数的定义

如果成员使用过外层作用域的某个名字,则这个类型不能重复定义在内层。

typedef double Money;
string bal;
class Account {
    public:
        Money balance() {return bal; } // 使用了外层的Money
    private:
        typedef double Money; //报错,不能重复定义Money
        Money bal;
};

一般不建议成员函数的参数使用其他成员的名字:

int height;
class Screen {
    public:
        typedef std::string::size_type pos;
        void dummy_fcn(pos height) { 
            cursor = width * height; 
            // 这里使用的height为参数声明中的height,函数声明位于函数的作用域内。
            // 如果想使用下面的height的话可以使用 this->height
        }
    private:
        pos cursor = 0;
        pos height = 0, width = 0;
};

尽管外层的对象被隐藏了,我们也可以通过::height来访问它。


标签:函数,作用域,Money,C++,height,查找,primer7.4,bal
From: https://www.cnblogs.com/hy227/p/16852571.html

相关文章

  • C++——sqrt函数基本使用方法
    一、sqrt函数作用sqrt是用来求一个数的开根的,等同于开根号。二、使用时需要的头文件#include<cmath> 三、基本用法及注意事项sqrt(需要开根的内容)sqrt函数只能对dou......
  • 【c&c++】 #if 0/#if 1用法
    当屏蔽掉大块代码时,使用"#if0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围,当被注释掉的......
  • C++ nullptr/nullptr_t
    解释关键词nullptr代表指针字面量。它是std::nullptr_t类型的纯右值。存在从nullptr到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也......
  • C# 调用C++ 动态连接库
    #pragmaonce#defineDLL_API__declspec(dllimport)extern"C"DLL_APIint__stdcallSum(inta,intb);operation.h#include"pch.h"#include"operation.h......
  • C++——变量作用域
    全局变量在全部函数(包括main函数)外面定义的是全局变量;在整个程序生命周期内都是有效的,在定义位置之后的任意函数中都能访问(在定义位置之前的任何函数都不能访问)全局变量......
  • C/C++ Qt 数据库与Chart实现历史数据展示
    在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记......
  • <六>理解C++ new delete
    new和malloc区别?delete和free区别?malloc和free是C语言的库函数new和delete叫做运算符malloc是否开辟成功是通过返回值和空指针比对判断.和new开辟失败会抛出异常.bad_......
  • C++的前置声明
    C++的前置声明C++前置声明,这玩意看起是不是超级简单?我们来看几个问题:模板怎么前置声明typedef怎么前置声明模板的typedef怎么前置声明是不是还是比较头疼的......
  • QML实例化C++的类
    [网页](https://blog.csdn.net/baidu_33850454/article/details/81907857?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166731863916782429784725%2522%252C......
  • 如何解决何避免多个C/C++动态库函数同名冲突
    前言现在的开发节奏越来越快,有大量现成的库来方便我们的开发者来使用,避免重复造轮子,而且有很多有生命力的开源社区。当然在使用过程中,你可能为这样的场景而头痛:你的项目中用......