﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-一知半解-随笔分类-C/C++</title><link>http://www.cppblog.com/jzgnh/category/7644.html</link><description>凡事不求甚解，有这么一知半解就开始写，呵呵~~</description><language>zh-cn</language><lastBuildDate>Sat, 02 Aug 2008 12:35:26 GMT</lastBuildDate><pubDate>Sat, 02 Aug 2008 12:35:26 GMT</pubDate><ttl>60</ttl><item><title>vc++ 中的 属性</title><link>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html</link><dc:creator>静静的想</dc:creator><author>静静的想</author><pubDate>Fri, 25 Jul 2008 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html</guid><wfw:comment>http://www.cppblog.com/jzgnh/comments/57142.html</wfw:comment><comments>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jzgnh/comments/commentRss/57142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jzgnh/services/trackbacks/57142.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 在vb、c#、javascript这些脚本语言中都有属性这个东西，使用起来相当方便，甚至在COM中也有属性这一说。可偏偏在C++中没有这个，在实现COM的时候使用的是虚函数表，归根揭底COM的属性是使用C++函数来实现的，所以在我们调用的时候总没有个方便的方法来使用属性。不过属性确实是使用起来方便，最起码是书写起来方便。 <br><br>&nbsp;&nbsp;&nbsp; 可能是为了和VB和C#统一吧，所以微软在C++的扩展里面也提供了属性这个东西，跟vb 和c#很相似（对象的属性<strong>&nbsp; </strong>property ，不是[]属性attribute 啊），其实就是微软自己的扩展（Microsoft-Specific，不知道如何翻译，微软特有？），所以其他的编译器可是不支持的哦。呵呵~说了一大堆废话，其实就是说在vc++(<span style="color: red;">VC6中有</span><sup>[1]</sup>,VC2005中有,相信VC2008中也有)中添加了一个新的关键字__declspec(property)) 。下面就介绍下这个关键字的用法。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; [1] 原来没有vc6 环境,没测试,看看文档以为没有呢,其实vc6也支持,今天刚测试了,赶快更正~<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emembarrassed.gif" align="absmiddle" border="0"><br>&nbsp;<br>在MSND 中的说明为(http://msdn.microsoft.com/en-us/library/yhfk0thd(VS.80).aspx ):
<p><strong>
<pre class="libCScode" id="ctl00_rs1_mainContentContainer_ctl05other" space="preserve"><strong>__declspec(</strong>property({<strong>get=</strong><em>get_func_name</em>|<strong>,put=</strong><em>put_func_name</em>}<strong>))<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><strong><strong>__declspec(&nbsp;property(&nbsp;</strong></strong></span><span style="color: #0000ff;"><strong><strong>get</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>get_func_name&nbsp;)&nbsp;)&nbsp;declarator<br>__declspec(&nbsp;property(&nbsp;put</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>put_func_name&nbsp;)&nbsp;)&nbsp;declarator<br>__declspec(&nbsp;property(&nbsp;</strong></strong></span><span style="color: #0000ff;"><strong><strong>get</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>get_func_name,&nbsp;put</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>put_func_name&nbsp;)&nbsp;)&nbsp;declarator</strong></strong></span></div>
</strong><strong><strong><strong><strong style="font-weight: normal;">,这个变量不占用内存,只是个名字而</strong></strong><strong style="font-weight: normal;"> </strong></strong></strong><span style="font-weight: normal;">    如何使用呢?先看人家微软给的例子:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;declspec_property.cpp</span></strong><span style="color: #008000;"><br></span><strong><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span></strong><strong><span style="color: #000000;">&nbsp;S&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;i;<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;putprop(</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;j)&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span></strong><strong><span style="color: #000000;">&nbsp;j;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;</strong><span style="color: #000000;"><br></span><strong><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;getprop()&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span></strong><strong><span style="color: #000000;">&nbsp;i;<br></span><span style="color: #008080;">10</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;</strong><span style="color: #000000;"><br></span><strong><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;__declspec(property(</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getprop,&nbsp;put&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;putprop))&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;the_prop;<br></span><span style="color: #008080;">13</span>&nbsp;</strong><strong><span style="color: #000000;">};<br></span><span style="color: #008080;">14</span>&nbsp;</strong><span><br><strong>15</strong></span><strong>&nbsp;<span style="color: #000000;"></span></strong><strong><span>int&nbsp;main()&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;S&nbsp;s;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;s.the_prop&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span></strong><span><strong>5;</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里其实就是调用的putprop方法<br><strong>18</strong></span><strong>&nbsp;</strong><span><strong>&nbsp;&nbsp;&nbsp;return&nbsp;s.the_prop;</strong>&nbsp;&nbsp; //而这里调用的就是getprop方法了<br></span><strong><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">}</span></strong></div>
<br>   很简单吧~,msdn上的描述是英文的,俺就不翻译了,英文水平很次,大意是编译器把这个声明当成一个虚拟数<br>据变量(<strong style="font-weight: normal;">virtual data members, 俺就直接说属性更容易理解),这个其实只是个符号，在编写代码的时候当成<br>属性来对待，编译的时候编译器会把此属性对应到相应的函数调用,其实还是C++本身的函数调用,只是书写上的<br>方便,不过如果只是在Windows上的开发,这个也省事不少啊。<br> <br>   如果声明成只读属性那么只要指定get就行，同理只写属性只要指定put就可以了~ <br> <br><br><br>   简单的属性例子就是这样了，MSDN上貌似介绍的不够详细，如果我们的属性是数组如何对待呢？多维数组呢？ <br><br><br> <br>   其实数组也是一样的，只是数组需要有参数来传递他的下标，还有个好消息要说的是，这个下标可不仅仅是简<br>单的整形变量了，只要你想写什么类型的都可以，呵呵~~在COM编程时如果使用了#import 来引入的类库信息，<br>生成的代码里很多数组就是使用了_variant_t类型哦~，二维或者多维数组呢只是多了几个参数而已，很简单，<br>不过使用属性的时候一定要是 s.prop[i][j],必须要用数组的形式调用才会映射正确所需要调用的函数啊，否则<br>会报错滴，俺经常犯的错就是使用了()，失误~~<br><br> <br>   代码其实就也是一样的了，只是在方法中多传递几个参数而已，这里没环境，代码如下:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;"><strong><strong>&nbsp;1</strong></strong></span><strong><strong>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;declspec_property.cpp</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;S&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;putprop(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;var)&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i[index]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;var;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getprop(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;i[index];<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;__declspec(property(</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getprop,&nbsp;put&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;putprop))&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;the_prop[];<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;s;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;s.the_prop[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;s.the_prop[</span><span style="color: #000000;">3</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">}</span></strong></strong></div>
<br> <br>   算是写完了，呵呵~~这个比较简单~~   <br></strong></span><br>  </pre>
</strong>
</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/jzgnh/aggbug/57142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jzgnh/" target="_blank">静静的想</a> 2008-07-25 15:04 <a href="http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>