﻿<?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/sscchh-2000/category/1294.html</link><description>与大家一起分享知识</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 14:41:43 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 14:41:43 GMT</pubDate><ttl>60</ttl><item><title>关于时间的几个变量</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/12/29/16969.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Fri, 29 Dec 2006 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/12/29/16969.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/16969.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/12/29/16969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/16969.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/16969.html</trackback:ping><description><![CDATA[最近看到了关于时间上面的几个变量：timeval,time_t,tm。请了解的详细说说它们的定义和相关的调用函数，让大家一起来学习，呵呵。<img src ="http://www.cppblog.com/sscchh-2000/aggbug/16969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-12-29 11:07 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/12/29/16969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中视图(View)通知对话框(Dialog)的方法</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/28/6438.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Fri, 28 Apr 2006 13:47:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/28/6438.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/6438.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/28/6438.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/6438.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/6438.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在利用				VC				＋				MFC				编程的时候，我们往往能碰到这种情况：在一个模拟程序中（如有些游戏），需要实时显示一些属性的值（文字或者图形），这个时候我们可以重新打开一个对话框（可以是一个模态或者非模态的）来显示这些信息，本文以模态对话框为例，简单实现这个技术。以下代码阴影部分是我利用				ClassWizard				加的，蓝色部分是我手工加的。其余是...&nbsp;&nbsp;<a href='http://www.cppblog.com/sscchh-2000/archive/2006/04/28/6438.html'>阅读全文</a><img src ="http://www.cppblog.com/sscchh-2000/aggbug/6438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-28 21:47 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/28/6438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个读取数据库的问题</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/25/6272.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Tue, 25 Apr 2006 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/25/6272.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/6272.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/25/6272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/6272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/6272.html</trackback:ping><description><![CDATA[
		<p>最近由于要发布交通仿真程序(TSS)的Demo版，以前程序使用的是基于SQL2000数据库的数据源，现在需要改成基于Access数据库，但是在改成Access数据库之后，发现仿真的时候，前台客户端程序可以正常读取Access数据库，而后台服务器进程不能够正确的读取数据库。为什么使用SQL2000数据库的时候没有问题，而使用Access数据库就会出现问题呢？经过调试终于找出了问题：当模拟开始的时候，前台此时正在保存该方案号的信息到数据库中，而此时后台服务器程序也紧接着读取该方案号信息，此时我觉得可能是Access数据库在处理并发的时候出现了问题。以致于服务器进程读取的方案号信息不正确，接下来的其它信息也就不正确了，这就造成了不能正常模拟。〔SQL数据库在处理这种情况时，可能是有一个很好的机制保证了数据的正确性。〕</p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/6272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-25 21:11 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/25/6272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中访问Access数据库的方法（不需要用户建立ODBC数据源）</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/13/ab.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Thu, 13 Apr 2006 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/13/ab.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/5457.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/13/ab.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/5457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/5457.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 由于项目要发布一个单机版，原来用的数据库是大型数据库。需要在单机版中用Access比较方便，另外也不能让用户自己创建数据源，最终的方案就是在程序中直接访问（*.mdb）Access数据库文件，下面简要给出在VC6.0中的访问Access数据库文件的方法：......<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/sscchh-2000/archive/2006/04/13/ab.html'>阅读全文</a><img src ="http://www.cppblog.com/sscchh-2000/aggbug/5457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-13 13:01 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/13/ab.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Thinking 学习笔记之二----说说C/C++的预处理宏</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5398.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Wed, 12 Apr 2006 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5398.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/5398.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5398.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/5398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/5398.html</trackback:ping><description><![CDATA[
		<p>在C/C++中，预处理宏需要注意几点：<br />1）看看两个语句：<br />typedef struct _person<br />{<br />char m_strName[16];<br />int m_nAge;<br />}*TPPerson;</p>
		<p>#define DPPerson \<br />struct _person \<br />{ \<br />char m_strName[16];\<br />int m_nAge; \<br />}*<br />现在我们有如下定义：TPPerson tp1,tp2; DPPerson dp1,dp2;<br />tp1 = tp2; dp1 = dp2;<br />上面第一条语句不会出错，没有任何问题。因为tp1,tp2都是对象指针，但是第二条语句就会出现问题，因为dp1是一个对象指针，而dp2是一个对象，这个宏隐藏的错误。<br />2）define SQUARE(X) (X)*(X)<br />这是求一个数的平方，但是在程序中如果有这样的语句：int x = 5,y; y = SQUARE(++x),这是一个逻辑错误又产生了。求得的实际值是42，而不是36。<br />3）字符串定义和标志粘贴<br />看看这两个宏定义：<br />#define TRACE(X) cout&lt;&lt; #X &lt;&lt; " = " &lt;&lt; X &lt;&lt; endl;<br />#define MEMBER(A) char* A##_string;int A##_size<br />第一条可以打印出任何一个表达式的值，第二条可以把两个字符串合并成一个变量，看下面的例子：<br />#include <iostream><br />#define TRACE(X) cout&lt;&lt; #X &lt;&lt; " = " &lt;&lt; X &lt;&lt; endl;<br />#define MEMBER(A) char* A##_string;int A##_size<br />using namespace std;</iostream></p>
		<p>int main()<br />{<br />for(int i = 0;i &lt; 10;i++)<br />TRACE((3+i));<br />MEMBER(one);<br />one_string = "Hello";<br />one_size = 4;<br />cout &lt;&lt; one_string &lt;&lt; ":" &lt;&lt; one_size &lt;&lt; endl;</p>
		<p>return 0;<br />}<br />运行结果是：<br />(3+i) = 3<br />(3+i) = 4<br />(3+i) = 5<br />(3+i) = 6<br />(3+i) = 7<br />(3+i) = 8<br />(3+i) = 9<br />(3+i) = 10<br />(3+i) = 11<br />(3+i) = 12<br />Hello:4</p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/5398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-12 15:57 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Thinking 学习笔记之一----变量的声明和定义</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5397.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Wed, 12 Apr 2006 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5397.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/5397.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/5397.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/5397.html</trackback:ping><description><![CDATA[变量的声明和定义的区别是：声明是向程序介绍一个名字，它指的是改名字是什么意思，在内存上并没有分配存储空间；而定义是指为这个名字分配存储空间。如在源文件example.c中的几个例子：<br />extern int i;//declaration without definition<br />extern int fun(void);//function declaration<br />float b;//declaration and definition<br />int fun(void)//definition<br />{<br />return 1;<br />}<br />int i;//definition<br />int add(int x)//declaration and definition<br />{<br />return x + 1;<br />}<br />void main()<br />{<br />b = 1.0f;<br />i = 2;<br />fun();<br />add(5);<br />}<br />extern int i; 指的是声明这个变量，在某个函数用到这个变量的时候，它会查找在该程序段中有没有<br />定义这个变量，如果没有，查找本模块的其他地方，之后查找整个全局空间。直到找到改变量的<br />定义，如果没有，程序出现编译错误。同样，如果在某个头文件定义了一个变量，例如：在example.h<br />头文件中定义了int x;如果有两个实现文件example1.c和example2.c都包含了该头文件，此时就会出现变量<br />重复定义错误。<img src ="http://www.cppblog.com/sscchh-2000/aggbug/5397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-12 15:55 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现（关于《[求助] 关于拷贝构造函数，对象传递！！》这篇文章）</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5387.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Wed, 12 Apr 2006 05:56:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5387.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/5387.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5387.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/5387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/5387.html</trackback:ping><description><![CDATA[
		<p>希望大家能够一起讨论，把矩阵这个类给完善。<br /><br />#include  &lt;iostream&gt;<br />using namespace std;</p>
		<p>class  Matrix<br />{<br />private:<br />    int  rows,columns;<br />    int **pMatrix;<br />public: <br />    Matrix(int rows = 3,int columns = 2);<br />    Matrix(const Matrix &amp;M);<br />    ~Matrix();<br />    Matrix&amp; operator=(const Matrix&amp; M);<br />    int  GetRows() const;<br />    int  GetColumns() const;<br />    void  SetValue();<br />    friend Matrix operator*(const Matrix&amp; a,const Matrix&amp; b);<br />    friend ostream&amp; operator&lt;&lt;(ostream&amp; os,const Matrix&amp; M);<br />};</p>
		<p>int  Matrix::GetRows() const  { return  rows;}<br />int  Matrix::GetColumns() const { return  columns;}</p>
		<p>// 构造函数 <br />Matrix::Matrix(int x,int y)<br />{<br />    rows = x;<br />    columns = y;<br />    //有的时候为了考虑创建对象的效率，在使用的时候分配存储空间，而不在构造函数中分配<br />    pMatrix = new int* [x];<br />    for (int i = 0 ; i &lt; x; i++ )<br />    {<br />        pMatrix[i] = new int[y];<br />        for(int j = 0;j &lt; y;j++)   //初始化每个值为0<br />            pMatrix[i][j] = 0;<br />    }<br />} <br />// 析构函数 <br />Matrix::~Matrix()<br />{<br />    for (int  i = 0 ;i &lt; rows;i ++ )<br />        delete[] pMatrix[i];<br />    delete[] pMatrix;<br />} </p>
		<p>// 赋值函数<br />Matrix&amp; Matrix::operator=(const Matrix&amp; M)<br />{<br /> if(this != &amp;M)<br /> {<br />  for (int  ii = 0 ;ii &lt; rows;ii++ )<br />   if(pMatrix[ii])<br />    delete[] pMatrix[ii];<br />  if(pMatrix)<br />   delete[] pMatrix;<br />    rows = M.rows;<br />    columns = M.columns;<br />  //分配存储空间<br />  pMatrix = new int* [rows];<br />  for (int k = 0 ; k &lt; rows; k++ )<br />   pMatrix[k] = new int[columns];</p>
		<p>  for ( int  i = 0 ; i &lt; rows; i ++ )<br />   for ( int  j = 0 ; j &lt; columns; j ++ )<br />    pMatrix[i][j] = M.pMatrix[i][j];<br /> }<br /> return *this;<br />}<br />void  Matrix::SetValue()<br />{<br /> int  i,j,value;<br /> for ( i = 0 ; i &lt; rows; i ++ )<br /> {<br />  for ( j = 0 ; j &lt; columns; j ++ )<br />  {<br />   cout &lt;&lt; " 第 " &lt;&lt; i &lt;&lt; " 行 " ;<br />   cout &lt;&lt; " 第 " &lt;&lt; j &lt;&lt; " 列: " ;<br />   cin &gt;&gt; value;<br />   cout &lt;&lt; endl;<br />   pMatrix[i][j] = value;<br />  } <br /> } <br />} <br />// 拷贝构造函数 <br />Matrix::Matrix(const Matrix&amp;  M)<br />{  <br /> rows = M.rows;<br /> columns = M.columns;<br /> //分配存储空间<br /> pMatrix = new int* [rows];<br /> for (int k = 0 ; k &lt; rows; k++ )<br />  pMatrix[k] = new int[columns];</p>
		<p> for ( int  i = 0 ; i &lt; rows; i ++ )<br />  for ( int  j = 0 ; j &lt; columns; j ++ )<br />   pMatrix[i][j] = M.pMatrix[i][j];<br />} </p>
		<p>Matrix operator*(const Matrix&amp; a,const Matrix&amp; b)<br />{<br /> if  (a.columns == b.rows)<br /> {<br />  Matrix c(a.rows,b.columns);<br />  for ( int  i = 0 ;i &lt; a.rows;i ++ ) <br />  {<br />   for ( int  j = 0 ;j &lt; b.columns;j ++ )  <br />   {  <br />    for ( int  columnIndex= 0 ;columnIndex &lt; a.columns;columnIndex++ )<br />     c.pMatrix[i][j] += a.pMatrix[i][columnIndex] * b.pMatrix[columnIndex][j];<br />   }<br />  }<br />  return c;<br /> }<br /> else<br />  return Matrix();<br />}</p>
		<p>ostream&amp; operator&lt;&lt;(ostream&amp; os,const Matrix&amp; M)<br />{<br /> for (int i = 0;i &lt; M.rows;i++ )<br /> {<br />  for (int j = 0;j &lt; M.columns;j++ )<br />   os &lt;&lt; M.pMatrix[i][j] &lt;&lt; "  ";<br />  os &lt;&lt; endl;<br /> }<br /> return (os &lt;&lt; endl);<br />}</p>
		<p>
				<br />// 主函数 <br />void  main()<br />{<br /> Matrix Ma(3,2),Mb(2,2);<br /> Ma.SetValue();<br /> Mb.SetValue();<br /> cout &lt;&lt; Ma &lt;&lt; endl;<br /> cout &lt;&lt; Mb &lt;&lt; endl;<br /> <br /> Matrix Mc = Ma * Mb;//拷贝构造函数<br /> cout &lt;&lt; Mc &lt;&lt; endl;<br /> Mc = Mb;     //=运算符，即赋值函数<br /> cout &lt;&lt; Mb &lt;&lt; endl;<br />} </p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/5387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-12 13:56 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/12/5387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C++模板函数的问题</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/11/5297.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Tue, 11 Apr 2006 08:19:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/11/5297.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/5297.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/11/5297.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/5297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/5297.html</trackback:ping><description><![CDATA[
		<p>如下代码:<br />template &lt;class T&gt;<br />const T&amp; max(const T&amp; a,const T&amp; b)<br />{<br />    return a &gt; b ? a : b;<br />}</p>
		<p>int main()<br />{<br />    const float f = max&lt;float&gt;(1.5f,2.5f);<br />    return 0;<br />}<br /><br />这里const float f = max&lt;float&gt;(1.5f,2.5f);这句怎么在编译的时候不能通过呢?我的平台是gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5),希望能够得到大家的帮助.<br /></p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/5297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-11 16:19 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/11/5297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编程思想学习笔记－常量(转自一己薄剑)</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/04/4996.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Tue, 04 Apr 2006 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/04/4996.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/4996.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/04/4996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/4996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/4996.html</trackback:ping><description><![CDATA[
		<p>一、全局范围的const使用<br />1、const的使用有两种效果，一是生成编译期常量，二是运行期常量。<br />      做为编译期常量主要用作值替代，即取代C中的＃define常量定义，一般用于设置数组大小。<br />   此时不分配存储空间，只在有extern限定或取地址时才会分配空间。<br />      做为运行期常量主要控制程序的安全性，它们会被分配空间，但一经初始化就不能再改变，<br />   数组，结构等集合始终是运行期常量，不能当做编译期常量使用，例如不能用于设置数组大小。<br />   另外C中的const只是运行期常量。<br />2、const对指针的使用<br />   指向const的指针 const int* x，int const* x；<br />   const指针 int* const x；<br />   注意：关于赋值，不能把const指针（引用）赋给非const指针（引用）（会通过非const指针改<br />   变const指针指向的值！），但可以把非const指针（引用）赋给const指针（引用）。这是基于<br />   安全的考虑。<br />3、const用于函数参数与返回值<br />       参数做为const值一般作为函数中的一个初始值；但一般如下使用更易理解：<br />  void f(int ic)<br />  {<br />   const int&amp; i=ic;<br />   //others<br />  }<br />    参数做为const指针或引用是基于安全与效率的原因；并且一般不改变参数的函数，参数要用<br /> const int* cip或const int&amp; ci;这样的函数可const和非const参数，若函数参数没有const<br /> 修饰则只能接受非const参数，不能接受const参数，不具有通用性，所以记住如下用法：<br />     void f(const int&amp; ic)<br />     {}<br /> 注意：所有临时变量都是常量；<br />        返回值做为const值时表明此返回值不能做为左值或修改，一般用于用户自定义类，对于内部<br />    数据无意义。<br />        返回值做为const指针时要注意接受返回值的变量要为const所修饰。<br />二、类内部的const使用<br />1、类内部const的含义－它在每个类对象里分配存储空间，且一旦初始化后就不能改变（运行期常<br />   量），它要在构造函数的初始化表中初始化。<br />2、要想在类内部使用编译期常量，可以使用enum枚举；它不会占用存储空间。<br />3、const用于成员函数－表明此类函数不会改变对象的数据，能被const对象所调用（const对象只<br />   能调用const成员函数）但若想在const成员函数中改变数据，有两种方法：<br />   1&gt;通过this指针把const变量强制转换为非const的。<br />   2&gt;用mutable修饰要改变的变量。<br />   推荐使用2&gt;。<br />三、volatile的使用<br />   表示此数据可以被改变－－用于编译器对此数据的优化假定，当编译器读取此数据时会认为它已<br />   被改变会再次读取到寄存器中，不会假定它没变从而直接使用寄存器的值。<br />   const volatile表示这个对象不能被程序员改变，但可以通过外面的工具改变（？不懂）。</p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/4996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-04 15:52 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/04/4996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对C++中友元的思考</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4940.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Mon, 03 Apr 2006 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4940.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/4940.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4940.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/4940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/4940.html</trackback:ping><description><![CDATA[
		<p>在C++中，如果以一个类想允许不属于当前类的成员函数访问该结构中的私有或保护数据时，那该怎么办呢？<br />这时可以用上friend这个关键字。例如：<br />class A;//Declaration</p>
		<p>class B<br />{<br />public:<br /> void fun(A *a);<br />};</p>
		<p>class A<br />{<br />private:<br /> int i;<br />public:<br /> void initialize();<br /> class D<br />{<br /> private:<br />    A *h;<br /> public:<br />    void initialize();<br /> }<br /> friend void g(A *a,int i);<br /> friend void B::fun(A *a);<br /> friend class C;<br /> friend void h();<br /> friend A::D;<br />};</p>
		<p>void X::initialize()<br />{<br /> i = 0;<br />}</p>
		<p>void g(A *a,int i)//全局函数g直接访问了类A的私有成员<br />{<br /> a-&gt;i = i;<br />}</p>
		<p>void B::fun(A *a)//类B的成员函数直接访问了类A的私有成员<br />{<br /> a-&gt;i = 47;<br />}</p>
		<p>class C<br />{<br />private:<br /> int j;<br />public:<br /> void initialize()<br /> void g(A *a);<br />};</p>
		<p>void C::initialize()<br />{<br /> j = 99;<br />}</p>
		<p>void C::g(A *a)//类C的成员函数g直接访问了类A的私有成员<br />{<br /> a-&gt;i = j;<br />}</p>
		<p>void h()//全局函数h直接访问了类A的私有成员<br />{<br /> A a;<br /> a.i = 100;//<br />}<br /></p>
		<p>void A::D::initialize()//访问A的私有变量i<br />{<br />   h-&gt;i = 10;<br />}<br /><br />void main()<br />{<br /> A a;<br /> C c;<br /> c.g(&amp;a);<br />}</p>
		<p>通过上面的例子，我们可以看到直接访问类A的私有成员i的方法。但是，由此我想到，<br />当我们发布我们自己的C++库的时候，比如我们有这样一个库（含有tools.h,tools.lib,tools.dll三个文件）<br />头文件定义：<br />class CTools<br />{<br />private:<br /> int m_nId;<br /> int m_nSize;<br /> ...<br />public:<br /> ...<br />};<br />我们的目的想让像m_nId,m_nSize这样的私有变量隐藏起来，但是有一个用户在使用我这个库的时候，<br />只要他用friend关键字稍作修改就可以直接访问我们的私有变量了。如下：<br />class CTools<br />{<br />    <font color="#ff0000">friend class CUser;<br /></font> private:<br />    int m_nId;<br />    int m_nSize;<br />    ...<br />public:<br />    ...<br />};<br />这样的话，friend关键字是不是跟我们最初想把一些东西封装和隐藏起来相矛盾呢？</p>
<img src ="http://www.cppblog.com/sscchh-2000/aggbug/4940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-03 15:06 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类的sizeof大小</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4937.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Mon, 03 Apr 2006 06:34:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4937.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/4937.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/4937.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/4937.html</trackback:ping><description><![CDATA[类的sizeof大小一般是类中的所有成员的sizeof大小之和，这个就不用多说。<br />不过有两点需要注意：1）当类中含有虚成员函数的时候，例如：<br />class B<br />{<br /> float a;<br />public:<br /> virtual void fun(void);<br />}<br />此时sizeof(B)的大小为8，而不是4。因为在类中隐藏了一个指针，该指针指向虚函数表，正因为如此，<br />使得C++能够支持多态，即在运行时绑定函数的地址。<br />2）另一个要注意的是，当类中没有任何成员变量，也没有虚函数的时候，该类的大小是多少呢？<br />例如：<br />class B2<br />{<br /> void fun(void);<br />}<br />此时sizeof(B2)的值是多少呢？在C++早期的编译器中，这个值为0；然而当创建这样的对象时，<br />它们与紧接着它们后面的对象有相同的地址。比如：<br />B2 b2;<br />int a;<br />那么对象b2与变量a有相同的地址，这样的话对对象b2地址的操作就会影响变量a。所以在现在大多数编译器中，该值的大小为1。<img src ="http://www.cppblog.com/sscchh-2000/aggbug/4937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-03 14:34 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/03/4937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>何为仿函数(转自walkspeed)</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4915.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Sun, 02 Apr 2006 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4915.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/4915.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/4915.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/4915.html</trackback:ping><description><![CDATA[仿函数就是使对象使用行为看上去像个函数。<br />函数的使用是这样：<br />Function(param1,param2,...);<br />而对象的使用是这样：<br />Object.memberfunction(param1,param2...);<br />而仿函数对象的使用是这个样的<br />Object(param1,param2,...);<br />这样我们可以看出，从外表上看，仿函数对象和函数是一个东西。呵呵，当然他们是不同的。他们一样   不过是在使用的外形上一样罢了。<br /><br />    一个仿函数类如下定义<br />    class ObjectFunction<br />    {<br />        .......<br />        public:<br />            返回的类型 operator() ([param1,param2,...]);<br />     };<br /><br />     例1<br />     class ObjectFunction1<br />     {<br />          .......<br />          public:<br />              void operator() () { count &lt;&lt; "No Param ObjectFuntion" &lt;&lt; endl;<br />      };<br /><br />      例2<br />      class ObjectFunction2<br />      {<br />           ........<br />           public:<br />               bool operator() (int x)<br />               {<br />                   count &lt;&lt; "Have Param ObjectFuntion" &lt;&lt; endl;<br />                   count &lt;&lt; "This is ObjectFuntion's Param" &lt;&lt; x &lt;&lt; endl;<br /><br />                   return true;<br />                }<br />         }<br /><br />         仿函数的关键是要实现 operator() 运算符。<img src ="http://www.cppblog.com/sscchh-2000/aggbug/4915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-02 21:59 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++对字符的sizeof的处理</title><link>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4913.html</link><dc:creator>史传红</dc:creator><author>史传红</author><pubDate>Sun, 02 Apr 2006 13:17:00 GMT</pubDate><guid>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4913.html</guid><wfw:comment>http://www.cppblog.com/sscchh-2000/comments/4913.html</wfw:comment><comments>http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sscchh-2000/comments/commentRss/4913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sscchh-2000/services/trackbacks/4913.html</trackback:ping><description><![CDATA[在C中，<font color="#3333ff">sizeof</font>('a')的输出值是4（32位编译器，如GCC）或者2（16位编译器，如TC）；在C++中，<font color="#0033ff">sizeof</font>('a')的输出值是1，因为在C中，字符常量默认是一个int型的值，而在C++中它默认是一个char类型的值。为什么在C++中'a'被默认为char类型呢?我理解在C++中,有重载函数这个特性,例如:<br />void read(char var);<br />void read(int var);<br />如果我们调用这条语句:read('a');我们实际调用的是函数read(char var);然后如果C++中把'a'当成int类型来处理的话,这时候就会调用read(int var);这样的话就和我们的习惯不符.而在C中没有重载的概念,所以不会出现这样的情况.<img src ="http://www.cppblog.com/sscchh-2000/aggbug/4913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sscchh-2000/" target="_blank">史传红</a> 2006-04-02 21:17 <a href="http://www.cppblog.com/sscchh-2000/archive/2006/04/02/4913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>