user-0 提问: mfc内容求解

回复:
user: user-1
content: 关于CString可以查看msdnhttp://msdn.microsoft.com/en-us/library/aa315043%28v=vs.60%29.aspx 类类型转换你如果有C++ primer那本书（我的还是第四版）的话，可以看一下14.9节转换与类类型。

user: user-0
content: 引用 10 楼 ws_yqr 的回复:CString不能直接作为Read的x参数，是因为：传CString类型参数时，由于CString和void *类型不匹配，导致隐式类型转换，CString调用operator LPCTSTR()转换成LPCTSTR类型，LPCTSTR指向的是const类型，不能传递给非const的形参x。在哪可以找到先关内容？

user: user-2
content: 要想将cstring作为read的参数需要调用csting的getbuff

user: user-2
content: 引用 9 楼 ztzi321 的回复:引用 7 楼 lineage191 的回复:[quote=引用 4 楼 ztzi321 的回复:] [quote=引用 2 楼 lineage191 的回复:] 楼主纠结这些干嘛，没实际用，cstring穿不进去 就用getbuffer为什么write可以？ read 用getbuffer ，因为你要用cstring接收，但cstring 等价于const char（模糊的说），所以要想对其进行修改，出了他自己的函数外，就是操作调用getbuffer返回的指针， cstring 当然可以传给write 了，因为他存的就是字符串，read不能传的原因是因为read的参数不是const，[/quote] 求const void *和void *的区别[/quote]  const修饰参数表示函数内不会修改传入的实参，因此要传入一个const实参必须加const修饰形参，若是void*形参，函数因可能会改变传入的参数，因此当传入一个const的实参时编译器会提示错误。

user: user-1
content: CString不能直接作为Read的x参数，是因为：传CString类型参数时，由于CString和void *类型不匹配，导致隐式类型转换，CString调用operator LPCTSTR()转换成LPCTSTR类型，LPCTSTR指向的是const类型，不能传递给非const的形参x。

user: user-0
content: 引用 7 楼 lineage191 的回复:引用 4 楼 ztzi321 的回复:[quote=引用 2 楼 lineage191 的回复:] 楼主纠结这些干嘛，没实际用，cstring穿不进去 就用getbuffer为什么write可以？ read 用getbuffer ，因为你要用cstring接收，但cstring 等价于const char（模糊的说），所以要想对其进行修改，出了他自己的函数外，就是操作调用getbuffer返回的指针， cstring 当然可以传给write 了，因为他存的就是字符串，read不能传的原因是因为read的参数不是const，[/quote] 求const void *和void *的区别

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  CString::operator LPCTSTR operator LPCTSTR ( ) const;  Return Value  A character pointer to the string’s data.  Remarks  This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.  CString Overview |  Class Members |  Hierarchy Chart 好深奥！看不懂！。。。。

user: user-2
content: 引用 4 楼 ztzi321 的回复:引用 2 楼 lineage191 的回复:楼主纠结这些干嘛，没实际用，cstring穿不进去 就用getbuffer为什么write可以？ read 用getbuffer ，因为你要用cstring接收，但cstring 等价于const char（模糊的说），所以要想对其进行修改，出了他自己的函数外，就是操作调用getbuffer返回的指针， cstring 当然可以传给write 了，因为他存的就是字符串，read不能传的原因是因为read的参数不是const，

user: user-3
content: 引用 3 楼 ztzi321 的回复:[quote=引用 1 楼 user-5 的回复:]  virtual UINT Read(    void* lpBuf,    UINT nCount  ); virtual void Write(    const void* lpBuf,    UINT nCount  ); 这个我明白，我的意思是将控件设置成成员变量后（CString），read控件内容为什么不可以直接读，而write却可以。[/quote] 一，从函数名称推断，Read和Write功能应该是完全相反的。 二，因为是CFile类的两个成员函数，从类名称推断，应该一个是读文件一个是写文件。 三，从参数列表中的有无const推断，参数类型为const void* lpBuf的Write函数应该是“将输入的只读内存写入到文件中”，而参数类型为void* lpBuf的Read函数应该是“将文件中的数据读入到内存中”。 四，CString类型可以隐式转换为LPCTSTR指针类型，匹配const void*类型，由此可知，在写代码时可以将CString类型作为Write函数的参数

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  CString::operator LPCTSTR operator LPCTSTR ( ) const;  Return Value  A character pointer to the string’s data.  Remarks  This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.  CString Overview |  Class Members |  Hierarchy Chart

user: user-0
content: 引用 2 楼 lineage191 的回复:楼主纠结这些干嘛，没实际用，cstring穿不进去 就用getbuffer为什么write可以？

user: user-0
content: 引用 1 楼 user-5 的回复: virtual UINT Read(    void* lpBuf,    UINT nCount  );  virtual void Write(    const void* lpBuf,    UINT nCount  ); 这个我明白，我的意思是将控件设置成成员变量后（CString），read控件内容为什么不可以直接读，而write却可以。

user: user-2
content: 楼主纠结这些干嘛，没实际用，cstring穿不进去 就用getbuffer

user: user-5
content: virtual UINT Read(    void* lpBuf,    UINT nCount  );  virtual void Write(    const void* lpBuf,    UINT nCount  );