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();
cout<<"b.a:"<<b.a<<endl;
cout<<"a:"<<::a<<endl;
system("pause");
}
C++类的定义之作用域的更多相关文章
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)
什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...
- Java基础-变量的定义以及作用域详解
Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...
- C++ 类的定义与实现
摘自这篇博客https://blog.csdn.net/xulingxin/article/details/81335030 一."类" 的介绍 在C++中, 用 &q ...
- C++基础学习8:类的定义(class)
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错(??) b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1byte c) C语言中的结构体只涉及到 ...
- DLL导出函数和类的定义区别 __declspec(dllexport)
DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...
- python类的定义和使用
python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...
- java类中定义接口
今天看到一个java类中定义了接口,写个备忘录,记录一下 package com.gxf.test; public class Test_interface { public interface sh ...
随机推荐
- MYSQL使用二进制日志来恢复数据
mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是--start-position参数和--stop-position参数的使用. ·--star ...
- Cgroups概述
1. Cgroups是什么? 从 2.6.24 版本开始,linux 内核提供了一个叫做 Cgroups的特性.Cgroups是control groups的缩写,是一种可以限制.记录.隔离进程组(p ...
- Appium自动化测试环境的搭建及脚本执行
之前搭建了robotium的环境,并使用了一下,因为需要兼顾到ios的测试,所以这次又搭建了appium的环境.关于Appium的介绍网上有很多了,也可以去它的官网学习,这里就不在赘述了. 具体搭建步 ...
- 深入prototype源码之--Class
由于工作需要项目中要用prototype框架,所以这几天捣鼓了一下,研究了一下prototype 创建对象和类以及继承的一些源码,其实早在很久以前就接触prototype,然后直接看源码, 看着太蛋疼 ...
- 单节点伪分布集群(weekend110)的HBase子项目启动顺序
伪分布模式下,如(weekend110)hbase-env.sh配置文档中的HBASE_MANAGES_ZK的默认值是true,它表示HBase使用自身自带的Zookeeper实例.但是,该实例只能为 ...
- PopupWindow 问题集锦
1.响应返回键/响应键盘事件(onKeyListener) 最近在做PopupWindow, 发现使用PopupWindow一出现,不会响应popup外面的事件,经过资料查找,发现有两种方法可以响应外 ...
- Java之正则表达式
/* * 正则表达式对字符串的常见操作: * 1.匹配 * * 2.切割 * * 3.替换 * * 4.获取:Pattern p = Pattern.compile(" ...
- MBProgressHUD not showing
In my app, I am loading a resource heavy view that takes about 1 to 2 seconds to load. So I am loadi ...
- configparser
configparser configparser模块是python中用来处理类似于windows的ini格式文件, 一个ini文件的格式 [section] key = value
- uploadPreview 兼容多浏览器图片上传及预览插件使用
uploadPreview兼容多浏览器图片上传及预览插件 http://www.jq22.com/jquery-info2757 Html 代码 <div class="form-gr ...