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

例如:

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. UVa 10900 (连续概率、递推) So you want to be a 2n-aire?

    题意: 初始奖金为1块钱,有n个问题,连续回答对i个问题后,奖金变为2i元. 回答对每道题的概率在t~1之间均匀分布. 听到问题后有两个选择: 放弃回答,拿走已得到的奖金 回答问题: 如果回答正确,奖 ...

  2. Java [leetcode 24]Swap Nodes in Pairs

    题目描述: Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1-& ...

  3. Ext入门学习系列(五)表格控件(1)

    上节学习了Ext面板控件,为后面的各个控件学习奠定基础,在此基础上本章将学习网络开发最期待的功能——表格控件. 我们都知道网络编程语言中,除了.net其他的基本没有提供网格控件,而最近的asp.net ...

  4. 分布式数据库中间件TDDL、Amoeba、Cobar、MyCAT架构比较分

    比较了业界流行的MySQL分布式数据库中间件,关于每个产品的介绍,网上的资料比较多,本文只是对几款产品的架构进行比较,从中可以看出中间件发展和演进路线 框架比较 TDDL Amoeba Cobar M ...

  5. delphi获得当前鼠标坐标

    简单的说就是取鼠标所在位置对应的窗口句柄? procedure TForm1.Timer1Timer(Sender: TObject);vara:TPoint; //用来存放坐标hw:HWND; // ...

  6. 018如何建立自动化框架 how to bulid the framwork

    本讲包括: 一. objective 二. How to bulid 三. Keyview of frawork (关键视图) 四. conclusion automation framwork:自动 ...

  7. 多线程与网络之NSURLConnection发送请求

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. 获取EntityFrameWork返回的错误和ModelState中的错误

    都是通过循环才能找到具体的错误信息 具体方法参见这两篇文章: EntityFrameWork: http://www.cnblogs.com/shouzheng/archive/2012/04/19/ ...

  9. windows内核窥探

    windows是一个非常优秀的OS,从今天开始,我要和大家共同分享windows给我们带来的快乐!本人只所以将自己的学习笔记与大家分享,一是让自己更深入的理解windows,再就是有什么疏漏之处,望大 ...

  10. MySQL 字段类型详解

    一.非数字类型 类型 范围 说明   Char(N) [ binary] N=1~255 个字元 binary :分辨大小写 固定长度 std_name cahr(32) not null VarCh ...