• C++类的定义之作用域


    每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明内成员,将成员名引入类的作用域。两个不同的类具有两个不同的类作用域。

    例如:

    Class First {

    int memi;

    double memd;

     };

    Class Second {

    int memi;

    double memd;

    };

    First obj1;

    Second obj2=obj1;//error:obj1and obj2 have different types

    上例说明 即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类(任何其他作用域)的成员。在类作用域之外,成员只能通过对象或指针分别使用成员访问操作符"."或"->"来访问。如 

    Class obj;

    Class *ptr = &obj;

    ptr->member; ptr->memfcn();

    obj.member; obj.memfcn();

    另外也能用作用域操作符来访问 如

    Double Sales_item::avg_price() const

    {

    if(units_sold)

    return revenue/units_sold;

    else

    return 0;

    }

    在上述例子中,我们用完全限定名Sales_item::avg_price来指定这是类Sales_item作用域中的avg_price成员的定义。(一旦看到完全限定名,就知道该定义是在类作用域中)因为是在类作用域中 所一调用 revenue和units_sold不需要写成 this->revenue或this->units_sold。同时 定义于类外部的成员函数中,形参表和成员函数体都出现在成员名之后,这些都是在类作用域中定义,所以可以不用限定而引用其他成员。

    与形参类型相比,返回类型定义在成员名字前面。如果函数在类定义体外定义,那么用于返回类型的名字在类作用域之外。如果返回类型使用由类定义的类型,则必须使用完全限定名。

    Class Screen{

    Public:

     Typedef std::string::size_type index;

     Index get_cursor() const;

    };

    inline Screen::index Screen::get_cursor() const

    {

    return cursor;

    }

    该函数返回类型是index,这是在Screen类内部定义的一个类型名。

    C++语言中允许声明全局变量,并且类成员的实现是在类的外部,因此经常会遇到作用域的问题。这里简单列出来平时遇到的一些问题。

    一、类成员函数定义中的参数

    一个简单的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class T
    {
        public:
            typedef double Num;
            void setValue(Num num);
        private:
            Num value;
    };
     
    void T::setValue(Num num)
    {
        this->value = num;
    }

    其中,Num是在类T中定义的类型,setValue是类T的成员函数的定义(在类外部),因此setValue一定是在类的作用域范围内的,当然形参表也在类的作用域内。因此上面的用法是合法的。

    二、成员函数的返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class T
    {
        public:
            typedef double Num;
            Num getValue();
        private:
            Num value;
    };
     
    Num T::getValue()
    {
        return this->value;
    }

    与形参类型相比,返回值的类型位于成员函数体的前边,因此C++不认为Num是在类的作用域内,如果对上面的代码进行编译,编译器会报错。正确的写法是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class T
    {
        public:
            typedef double Num;
            Num getValue();
        private:
            Num value;
    };
     
    T::Num T::getValue()
    {
        return this->value;
    }
    #include<iostream>
    using namespace std;
    
    class A{
        public:
            int a;
            void func();
    };
    void A::func(){
        cout<<"func"<<endl;
    }
    int a;
    class B : public A{
        public:
            int b;
            void funcc(int i){
                B::a = i;//属性域作用符
             ::a = i+100;//全局域作用符
            }
    };
    void main(){
        A a;    
        B b;
        //B::a = 4;//出错
        b.funcc(8);
        cout<<"b.a:"<<b.a<<endl;
        cout<<"a:"<<::a<<endl;
        system("pause");
    }
  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/yaowen/p/4806585.html
Copyright © 2020-2023  润新知