zoukankan      html  css  js  c++  java
  • 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");
    }
  • 相关阅读:
    ZoneJS 的原理与应用
    RxJS 中的观察者和迭代器模式
    前端三大框架:数据绑定与数据流
    Angular 的前世今生
    验证Kubernetes YAML的最佳实践和策略
    GitOps初阶指南:将DevOps扩展至K8S
    如何使用Istio 1.6管理多集群中的微服务?
    5个规则,确保你的微服务优化运行
    使用Thanos实现Prometheus指标联邦
    丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
  • 原文地址:https://www.cnblogs.com/yaowen/p/4806585.html
Copyright © 2011-2022 走看看