下一代C++:C++/CLI语言的属性摸索[VC/C++编程]
本文“下一代C++:C++/CLI语言的属性摸索[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
前言:
本文展示了欧洲计算机开辟商协会正在发展的C++/CLI(一种差别的C++语言,它便利开辟人员在微软的.NET框架下更简单地开辟程序)语言在C++语言上的扩大.写这篇文章的目的并非要倡议尺度C++包含这部份扩大,也不是对C++/CLI的承认,而只是在探究C++/CLI语言在这一范畴的发展方向.
1、底子知识
C++/CLI中的属性是近似与各种数据成员(有各种操作限制)的可操作实体,但是这种操作常常被转化为调用存取函数(这主如果"getter"和"setter"函数).比方:
struct Demo1 {
property int Val { // 一个非常简单的整型、分级属性.
int get() const {
++Demo1::access_count;
return this->value;
}
void set(int v) {
++Demo1::access_count;
this->value = v;
}
}
private:
int value;
static unsigned long access_count;
};
int main() {
Demo1 d;
d.Val = 3; // 调用"set"操作函数.
return d.Val; //调用"get"函数.
}
存取函数的名字必须是get 大概是 set函数,二者之中的任何一个都可以被省略,但毫不能二者全省略.省略一个存取函数招致只存在一个读属性或只存在一个写属性.属性的地址是无法获得的,但是,存取函数作 为成员函数理所当然地可以被用来产生指向成员的指针常量(比方:&Demo1::Val::set).
属性可以利用关键字"virtual"举行声明,这意味者存取操作函数是虚函数,纯虚属性函数也是大概存在的,比方:
struct VirtualProp {
virtual property int Val = 0 {
int get() const; // 纯虚函数.
virtual void set(int v); //纯虚函数,这里关键词"virtual"是多余的.
}
// ...
};
上述例子显示了普通情形下碰到的一些简单的、非静态的、分层次的属性实例.C++/CLI文档包含了大量的概念改变,下文将举行注释.
2、动机
在尺度C++的上下文中,属性约定成俗地利用"get和set函数"文法,这种文法将表露的数据和谐地转换为封闭地状况信息.在更精密的及时框架上下文中(具体的说是微软的.NET框架),属性是可以通过映射及时发觉和改正的元素.比方,现代的GUI库将它的组件参数声明为属性,可视化的界面修建工具装载这些库,利用装载各种组件的属性列表并将后果展示到用户眼前,当用户改正了一个属性,存取操作函数将被调用,比方这将触发各种GUI更新事件.
3、属性变量
除了上述代码中声明的简单的分层属性,C++/CLI还引进了其他几种范例属性变量.
(一)静态分层属性
静态分层属性利用关键字"Static"来声明,它们的存取操作函数是静态的,静态属性的存取操作与静态数据成员的存取操作非常一致.(比方:利用C::P语法来获得C类的静态属性P)
(二)不明显的分层属性
一个属性的定义(即括号内的存取操作函数声明)可以利用分号";"来替换,在这种情形下,get和set存取函数综合成一个简单的可以存取操作的属性值.比方,C++/CLI定义的一个类以下:
struct TrivialProp {
property int Val;
};
上述代码从本质上与下述代码相同:
struct TrivialProp {
property int Val {
int get() const { return this->__Val; }
void set(int v) { this->__Val = v; }
}
private:
int __Val;
};
(三)指定索引属性
利用操作数构成员的老语法,指定索引可以操作一个数值调集,下面的例子显示了一维索引属性的操作.
struct Demo2 {
property int x[std::string] {
int get(std::string s) const { ... }
void set(int v, std::string s) { ... }
}
// ...
};
int main() {
Demo2 d;
std::string s("CLI");
d.x[s] = 3; // Calls Demo2::x::set(3, s)
return d.x[s]; // Calls Demo2::x::get(s)
}
注意,指定索引的属性不能是静态变量.
多维的索引属性也是可以的,它引入的操作语法与C/C++中数组元素操作办法不太一样,比方:
struct Demo3 {
property double x[std::string, int] {
double get(std::string s, int n) const { ... }
void set(double v, std::string s, int n) { ... }
}
// ...
};
int main() {
Demo3 d;
std::string s("CLI");
d.x[s, 7] = 42.0; // Calls Demo3::x::set(42.0, s, 7)
return d.x[s, 7] != 42.0; // Calls Demo3::x::get(s, 7)
}
背面的这一个例子阐明了呈目前括号内的操作索引属性的逗号标记是表达式操作标记,而不是一个逗号操作符.(下面将谈论这种法则带来的后果).
(四)默许的索引属性
除了对象被编入伪域外,默许的索引属性与指定的索引属性非常相象,对象本身可以索引(仿佛它自身有一个[]操作成员函数一样),从前的代码只要略微窜改一下便可以阐明这种改变.
struct Demo4 {
property double default[std::string, int] {
double get(std::string s, int n) const { ... }
void set(double v, std::string s, int n) { ... }
}
// ...
};
int main() {
Demo4 d;
std::string s("CLI");
d[s, 7] = 42.0; // Calls Demo4::default::set(42.0, s, 7)
return d[s, 7] != 42.0; // Calls Demo4::default::get(s, 7)
}
请关注关键词"default"替换属性名的用法.
4、一些技术性问题
欧洲计算机制造商协会(C++/CLI尺度的制订者)已经研究并办理了引入属性所带来的若干问题,下面这些内容特别值得关注.
(一)多维索引属性的操作
p->x[2, 3]表达式拥有差别的意思,这要视成员x能否是属性(这种情形下逗号脱离两个索引属性)或别的成员变量(这种情形下逗号是个操作标记,表达式的意思平等于p->x[3])而定.为了在一个属性索引中获得逗号操作符的效果,开辟人员可以利用圆括号(即p->x[(2, 3)]).
(注意,在依靠模版的表达式中,这将产生模糊性,并且直到实例化时问题才能得到办理)
(二)属性名与范例名冲突
微软.NET框架带有很多包含属性的类(这些类最初并非利用C++/CLI来开辟的),这些包含的属性名与属性范例的名字相同,比方:
typedef int Color;
struct Conflict {
property Color Color { // Property name hides type name
typename Color get() const;
void set(typename Color);
}
// ...
};
}
为了帮忙在这种上下文中书写代码,C++/CLI筹划增添语法,利用关键词typename来标识不尺度的范例(分外是"属性"),查找标志符的历程中将被轻忽.上述的代码就以这种新的情势利用typename关键词.
(三)重载的索引属性
索引属性可以被重载,即,几个指定索引属性可以利用同一个名字共存于同一个类中,假定它们可以按照属性的范例来区脱离来.类似地,默许的索引属性可以利用其他属性或操作符[]来重载.办理两意性与重载行为的法则已经被成立起来,来处理上述情形.
(四)保存的成员名字
C++/CLI属性通过综合特定的成员来实现,这些成员的名义由微软的.NET框架来规定,并且必须得到保存.
假如一个类包含分层的属性或指定索引属性X,成员名 get_X 和set_X在类中得到保存(即便属性仅仅包含一个操作函数也是这样).类似地,假如一个类包含有一个默许的索引属性,类中的成员函数get_Item 和set_Item也将得到保存.
以上是“下一代C++:C++/CLI语言的属性摸索[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |