C++类中定义数据成员的类型的几种方式

更新时间:2023-07-20 20:24:59 阅读: 评论:0

C++类中定义数据成员的类型的⼏种⽅式
时间:2014.04.04
地点:基地⼆楼
—————————————————————
⼀、简述
C++中除了在类中简单声明数据成员外,还可创建static数据成员,const成员,引⽤成员,const引⽤等。—————————————————————
⼆、.静态数据成员
应⽤背景:有时没必要让所有类的对象都包含某个变量的副本,或者说你需要⼀个只对类有意义的数据成员,⽽不适⽤于针对某个对象。⽐如设计⼀个电⼦表格的类,每个电⼦表格都有⼀个唯⼀的ID,我们可以为类设计⼀个从0开始的计数器,这样每个对象可从这个计数器得到⾃⾝的ID,但显然没必要为每个对象包含这个计数器,这样的⿇烦是因为你还得让计数器保持同步。解决的办法是使⽤静态数据成员。静态数据成员属于类,⽽不具体属于类的某个实例,可将静态数据成员当做属于类的全局变量,所有该类的实例对象都只有和可见这么⼀份。⽐如:衣服起球的原因
class MyClass
{
//......
protected:
猪皮的功效与作用static int counter_=0;
}
注意:在C++11中是可以在类的定义中初始化静态成员的。下⾯介绍具体的两个⽤法
1.在类的⽅法内访问静态数据成员
在类的⽅法内部可像使⽤普通数据成员⼀样使⽤静态数据成员。⽐如:
类的声明部分:
class MyClass
读书笔记10篇
{
public:
//.....
int get_id() const;
protected:
//.....
static int count=0;
int id_;
夸姐姐漂亮的句子
};
类的实现部分:
MyClass::MyClass(int in_width,int int height):
width_(in_width),height_(height)
{
id_=count++;
//......
}
也就是说在构造函数中可以访问静态数据成员counter就像访问普通数据成员⼀样。
2.在⽅法外访问静态数据成员
访问控制限定符也适⽤于静态数据成员。上⾯的counter是protected的,因此不能在类外访问,若是公有的则可,具体也是⽤作⽤域解析运算符指出这个变量是类的⼀部分,例如:
int i=MyClass::count;
当然,并不建议这么⽤,⽽是为类提供get/t⽅法来授权访问权限。如果想要访问静态数据成员,应该提供静态的get/t ⽅法。
消失的英文—————————————————————
三、常量数据成员
类的数据成员还可以声明为cosnt,这意味着在创建并初始化之后数据成员的值不能再改变。然⽽在对象层次上常量通常没有意义,因此常量数据成员通常也是静态的。如果某个常量只适⽤于类,应该使⽤静态常量数据成员⽽不是全局常量。例如设计⼀个表格类时,我们可能会指定表格表格的最⼤⾼度和宽度,这个值可设置成⼀个静态常量数据成员,当⽤户想要创建的表格⾼度或宽度⼤于该最⼤值时使⽤最⼤值,代码⽚段如下:
class SpreedSheet
{
public:
//......
白象家族
static const int kMaxHeight=100;
static const int kMaxWidth=100;
};
为什么说在对象层次上常量通常没有意义呢,私下认为,对象本⾝就是个变量,但对象⾥⾯却包含常量很不可思议,是不?换句话说:变得东西⾥含有不变的成分,那么不变的那部分还有什么意义呢。
有了上述类中的静态常量,我们就可以在类的构造函数中这样使⽤这个新的常量了。
SpreedSheet::SpreadSheet(int width,int hegiy):
width_(width<kMaxWidth?width:kMaxWidth),
height(height<kMaxHeight?height:kMaxHight)
{
id_=count++;
//......
}
香蕉蛋糕
这样当输⼊宽度或⾼度⼤于最⼤值时,会⾃动使⽤最⼤⾼度和宽度构造对象。由于kMaxHeight以及kMaxWith是公有的,因此可在程序的任何位置对其进⾏访问。但必须带作⽤域解析符,以说明该变量是哪个类的⼀部分。例:
cout<<SpreadSheet::kMaxHeight<<endl;
—————————————————————
四、引⽤数据成员
考虑⼀个架构问题:电⼦表格如何与应⽤程序通信?⾄少我们应该让应⽤程序存储电⼦表格,电⼦表格也该存储应⽤程序对象的引⽤。即具体来说SpreadSheet类必须知道SpreadSheetApplication类,SpreadsheetApplication类也必须知道SpreadSheet类,即通信是双⽅的,必须相互认识才能有效传递消息么。那么这⾥就存在⼀个问题,我们在类的实现⾥需要相互#inlcude,这就是传说中的循环引⽤问题,相互#include是不能解决问题的。解决⽅案是在其中⼀个头⽂件中使⽤前置声明。⽐如下⾯含前置声明的类的定义:
class SpreadsheetApplication;  //前置声明
classSpreadsheet
{
public:
Spreadsheet(int in_width,Int in_height,SpreadsheetApplication& the_app);
//......
protected:
//......
SpreadsheetApplication& the_app_;
};
这⾥类的定义将⼀个SpreadsheetApplicatin引⽤作为数据成员添加进来,建议使⽤引⽤,因为引⽤总是引⽤⼀个SpreadsheetApplication,⽽指针⽆法保证这点。在类的构造函数中,每个Spreeadsheet都得到⼀个应⽤程序的引⽤。若不引⽤某些事物,引⽤将⽆法存在,因此在构造函数中必须给the_app_⼀个值。
Spreadsheet::Spreadsheet(int in_width,int in_height,SpreadsheetApplication & the_app):
widthe_(in_width<kMaxWidth?in_width:kMaxWidth),
height_(in_height<kMaxHeight?in_height:kMaxHight),the_app_(the_app){}
也就是说类中的引⽤数据成员必须在类的所以构造函数中初始化它。包括复制构造函数:
Spreeadsheet::Spreadsheet(const Spreadsheet& src):
the_app_(src.the_app_){}
在初始化⼀个引⽤之后,不能改变它的引⽤对象。因此⽆需在赋值运算符中对引⽤赋值。—————————————————————
五、常量引⽤数据成员
和普通引⽤可以引⽤常量对象⼀样,引⽤成员也可以引⽤常量对象。可以这么看,常量不过是普通的⼀个特殊⽽已。例如:
class Spreadsheet
{
public:
Spreadsheet(int in_width,int in_height,const SpreadsheetApplication& the_app);
//......
protected:
//......
const SpreadsheetApplication& the_app_;
};
常量引⽤和⾮常量引⽤的⼀个重要区别是:⽐如这⾥的常量引⽤SpreadsheetApplication的数据成员 the_app_只能调⽤SpreadsheetApplication对象上的常量⽅法。如果试图通过常量引⽤调⽤⾮常量⽅法,编译报错。怎么刷微信步数

本文发布于:2023-07-20 20:24:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1089570.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:成员   数据   常量   对象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图