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;

}

时间: 2024-08-02 11:00:31

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

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

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J

类的定义及方法的重载

类:一类具有相同属性和方法的对象的集合 对象:这类方法的实例 举例: 比如人就是有一个类,具体的张三或者李四这个人就是这个类的实例化对象,代码体现如下: public class Person { public static void main(String[] args) { Person zhangsan = new Person(); } } //此时Person为类,zhangsan就是Person的类的实例化对象 方法的重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明

C++ Primer 学习笔记_15_类与数据抽象(1)_类的定义和声明 在C++中,用类来定义自己的抽象数据类型.通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写.调试和修改程序.可以使得自己定义的数据类型用起来与内置类型一样容易和直观. 看一下Sales_item类: class Sales_item { private: std::string isbn; unsigned units_sold; double revenue; public: double ave_pr

C++ Primer 学习笔记_47_类与数据抽象 --类的定义和声明【上】

类 --类的定义和声明[上] 引言: 在C++中,用类来定义自己的抽象数据类型.通过定义类型来对应所要解决的问题中的各种概念,可以使我们更容易编写.调试和修改程序.可以使得自己定义的数据类型用起来与内置类型一样容易和直观. 一个前面曾经定义过的类: class Sales_item { private: std::string isbn; unsigned units_sold; double revenue; public: double ave_price() const; bool sam

C++的类和类的定义

在面向对象的程序设计中,有经常接触类.对象等专业名词:到底什么是类.什么是对象呢?在程序又是怎样运用呢?类是面向对象程序设计的核心,它实际是一种新的数据类型,也是实现抽象类型的工具,因为类是通过抽象数据类型的方法来实现的一种数据类型.类是对某一类对象的抽象:而对象是某一种类的实例,因此,类和对象是密切相关的.没有脱离对象的类,也没有不依赖于类的对象. 什么是类 类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体.这有点像C语言中的结构,唯一不同的就是结构没有定义

C++学习笔记之作用域为类的常量和作用域内的枚举

一.作用域为类的常量 有些情况下,使符号常量的作用域为类很有用.如,类声明(不是定义)可能使用字面值30来指定数组长度,由于该常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错的主意,也许我们想像下面这样做: 1 class Weather 2 { 3 private: 4 const int Months = 12; //声明一个常量 5 double temperature[Months]; 6 ... 7 } 要注意的是,我们这是在声明阶段,需要在声明类的时候就有一个

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

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

实例/静态变量、局部变量和常量的定义及其作用域

实例变量属于类的某个特定实例,静态变量属于类,因为它们的作用域在整个类中都是可用的,所以也被称为全局变量.在类中定义实例变量或静态变量时,可以放在任何位置.但为了美观规范,设计类时最好统一放在类中的最前面. public class Testvariable { int a; //实例变量 static int b; //静态变量 //不能声明后,单独赋值 a = 5; //error b = 5; //error } 因为不符合语法规则, 赋值语句这个操作要放在语句块中才能执行.但可以声明变量

类--其他特性,作用域,构造函数,静态成员

一.类的其他特性 1.类成员再探 1)定义一个类型成员 除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名.由类定义的类型名字和其他成员一样存在访问限制,可以是public或者private中的一种.用来定义类型别名的成员必须先定义后使用,因此,类型成员通常出现在类开始的地方. 1 // 一个窗口类 2 class Screen 3 { 4 public: 5 typedef std::string::size_type pos; 6 private: 7 pos m_cursor