1、概述
本人对“C++实现C#属性概念”的研究决定并非一时冲动,而是原自于对技术的热爱。
用过C#的C渣渣程序员/媛都非常喜欢C#里面的属性的概念(注意,C#里的属性和成员变量之间是有区别的),可是C渣渣里并没有属性这个概念,于是,很多程序员/媛都想办法使用C渣渣抽象出类似C#中的属性的概念,当然我也不例外。
看过很多网友and同事写的C++属性实现方案,But似乎都没有找到很符合口味的实现,不是太难看懂就是太难使用。
so,本文介绍的是博主在工作过程中封装的C++实现属性的方法,不敢说多好用,但从使用形式上看,个人觉得与我了解到的方案中,博主实现的方案有如下特点:
1、易用且非常接近C#的使用风格。
2、代码量少,很容易看懂。
下面将一步一步介绍一些实现上的细节。
2、C# 属性的概念
本想略过对C#属性的介绍,但考虑到读者可能没使用过C#,也不知道C#的属性到底有什么用,因此还是稍微从使用的角度先解释一下C#中属性的概念(如果您对属性已经足够了解,可直接跳过本章或直接从下面第2点的“C++实现效果与C#效果对比”开始)。
一下内容包含如下部分:
1、简单示例代码介绍C#中的属性;
2、C++实现效果与C#效果对比;
1、简单示例代码介绍 C# 中的属性
我们来看第一段C#代码:
//示例代码1.0 class TestDemo { public String Name { get; set; } } class Program { static void Main(string[] args) { TestDemo test = new TestDemo(); test.Name = "test"; System.Console.WriteLine(test.Name); } } |
上面代码中,我们创建了一个String类型的属性Name,这个时候我们,我们的属性其实跟一个成员变量没啥区别,只是一个成员变量罢了。
另外,还需要读者了解的是,属性里的get和set分别控制属性的读写权限:
1、如果只有get,那么Name为只读模式;
2、如果只有set,那么Name为只写模式;
只读模式示例代码:
//示例代码1.0 class TestDemo { public String Name { get; } } class Program { static void Main(string[] args) { TestDemo test = new TestDemo(); test.Name = "test";//只读属性,赋值不允许,编译出错 System.Console.WriteLine(test.Name); } } |
只写模式示例代码:
//示例代码1.0 class TestDemo { public String Name { set; } } class Program { static void Main(string[] args) { TestDemo test = new TestDemo(); test.Name = "test"; System.Console.WriteLine(test.Name); //只写模式,test.Name取值不允许,编译失败 } } |
我们再来看一个复杂点的例子:
//示例代码1.0 class TestDemo { public String Name { get { return _name; } set { _name = value; TestWork(); } } public void TestWork() { System.Console.WriteLine(_name); } private String _name; } class Program { static void Main(string[] args) { TestDemo test = new TestDemo(); test.Name = "test"; } } |
以上代码中,我们运行到第28行的时候,会进入到第10行,最终运行结果打印出“test”。
是的,其实很简单,如果没有属性,我们完全可以用一个私有的成员函数,然后为每个成员函数添加一个get和set的方法(java下的通常做法),如下代码中的TestDemo完全能实现上面代码中属性的做法:
//示例代码1.0 class TestDemo { public String GetName() { return _name; } public void SetName(String value) { _name = value; TestWork(); } public void TestWork() { System.Console.WriteLine(_name); } private String _name; } …… |
OK,那为什么要有属性呢?
其实追求的真是一种书写方法吧,属性能让我们像访问成员变量一样访问直接赋值和取值,同时,在赋值和取值的时候,能根据需求调用相应的内部实现函数。
2、C++实现效果与C#效果对比
请读者对比下左右两边的属性Name的定义方式,C#里面的get和set方法在C++11实现中,使用了property_getter和property_setter实现,property_getter和property_setter中代码的实现方式与C#均一致。
OK,看完属性效果比较,如果您觉得对你的胃口,那么可以继续往下看,下面会有关于proerty_rw更详细的说明。