博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类的定义之作用域
阅读量:5022 次
发布时间:2019-06-12

本文共 1955 字,大约阅读时间需要 6 分钟。

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

例如:

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
using namespace std;class A{ public: int a; void func();};void A::func(){ cout<<"func"<

 

转载于:https://www.cnblogs.com/yaowen/p/4806585.html

你可能感兴趣的文章
只有 DBA 才能导入由其他 DBA 导出的文件
查看>>
数据库事务
查看>>
Nokia Imaging SDK
查看>>
.tar.gz文件和.rpm文件的区别
查看>>
linux 下 ifcfg-eth0 配置
查看>>
STL系列之八:探索hash_set
查看>>
存储过程&&数据库主从同步
查看>>
Android入门
查看>>
luogu P5301 [GXOI/GZOI2019]宝牌一大堆
查看>>
前端开发面试题
查看>>
Spring Bean配置
查看>>
2.1 <script>元素【JavaScript高级程序设计第三版】
查看>>
[Jmeter]jemeter启动报错,返回错误码 5,处理方法
查看>>
Spring 条件装配
查看>>
鸟哥的linux私房菜错误刊报,记得修改哦
查看>>
20181214第一周周训
查看>>
javadoc
查看>>
[ligerUI] grid行编辑示例
查看>>
JAVA语法——3为反序数
查看>>
软件工程的典型用户模板和场景
查看>>