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

例如:

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();
cout<<"b.a:"<<b.a<<endl;
cout<<"a:"<<::a<<endl;
system("pause");
}

C++类的定义之作用域的更多相关文章

  1. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  2. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  3. C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)

    什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...

  4. Java基础-变量的定义以及作用域详解

    Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...

  5. C++ 类的定义与实现

    摘自这篇博客https://blog.csdn.net/xulingxin/article/details/81335030   一."类" 的介绍     在C++中, 用 &q ...

  6. C++基础学习8:类的定义(class)

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错(??) b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1byte c) C语言中的结构体只涉及到 ...

  7. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  8. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  9. java类中定义接口

    今天看到一个java类中定义了接口,写个备忘录,记录一下 package com.gxf.test; public class Test_interface { public interface sh ...

随机推荐

  1. [POJ 2429] GCD & LCM Inverse

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10621   Accepted: ...

  2. 前端js框架收藏

    1. AngularJS :AngularJS是为克服HTML在构建应用上的不足而设计的. 2. knockout 3. avalon :MVVM是前端究极的解决方案,因此之后我大多数时间都在折腾av ...

  3. (三)学习MVC之密码加密及用户登录

    1.密码加密采用SHA256 算法,此类的唯一实现是 SHA256Managed.在Common/Text.cs里添加Sha256方法: public static string Sha256(str ...

  4. 【JMeter】JMeter完成一个java请求的压测

    先定义一下我说的remoteService:即远程调用服务,没有http的url.不对外提供或者对外提供有限的服务.具体视各公司的代码架构所定,比如有些公司为web工程,scf服务,db.scf即为服 ...

  5. Selenium webdriver 之select 控件封装,解决onchange问题

    使用webdriver的时候,select 控件经常会绑定onchange 事件,在selenium2.09 之前click 方法对onchange 事件有bug,2.09 以后修复了,但是根据经验也 ...

  6. LeetCode题解——Add Two Numbers

    题目: 两个数字求和,数字用链表表示,每一个结点代表一位.链表顺序与数字顺序相反,即表头存放数字的最低位. 解法: 分别遍历两个链表的每个结点,对两个结点求和即可.要维护一个变量保存每次相加之后的进位 ...

  7. 对单片机的modbus RTU的详细解释(转载)

    Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看协议资料 ...

  8. 关于贴友的一个书本页面简单布局(html+css)的实现

    贴友需求:以html+css仿照书本的页面实现布局效果(见图) html代码: 1: <!-- 我的博客:http://www.ido321.com --> DOCTYPE HTML> ...

  9. bzoj 2154 Crash的数字表格(莫比乌斯反演及优化)

    Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...

  10. 设计一个简单的,低耗的能够区分红酒和白酒的感知器(sensor)

    学习using weka in your javacode 主要学习两个部分的代码:1.过滤数据集 2 使用J48决策树进行分类.下面的例子没有对数据集进行分割,完全使用训练集作为测试集,所以不符合数 ...