明白了一点c++的东西,一一记下

    技术2022-05-11  41

          这段时间养病,看小说累了,就将家里唯二的实体书之一(另一本至今还看不懂)《c++核心思想》抱出来看了。看了几天,慢慢拾回了以前的一点点c++的东西,下了一个vs2005,试着写点小东西,结果发现编译时就出了问题。

            首先是vs2005和vc6.0不一样,直接新建源文件,此时是没有编译选项的,必须建立项目后,添加源文件才有编译的菜单出来。及其b4一把!另外,建立项目时,最好选择空,不然缺省会给你选上“预编译头” ,此时源文件都会自动给你加上什么"stdafx.h",main函数都变为了int _tmain(int argc, _TCHAR* argv[]),看着十分的不爽!

            按着上面说的建立一个空的项目后,此时发现如果include <iostream.h>后,可以直接编译通过,但是如果使用c++的特性,include <iostream>,此时必须继续使用using namespace std;才能编译通过。当时只是注意到这个现象,原因不解。

            继续看了一些书,在c++ primer看到解释了:

            C库头文件的 C++名字总是以字母C开头,后面是去掉后缀.h。 正如前面所解释的 由于在各种C++实现中,头文件的后缀各不相同,因此标准C++头文件没有指定后缀。     也 由于所有的C++库名std中被定义的,因而在我们的程序文本文件中,它们是不可见的,除非用下面的using指示符显式地使其可见:    using namespace std; 

     ——update于2007-06-17 星期日13:54:24.93

     


     

    cin和getline在一起使用时,注意cin在前面是,需要在使用getline之前,使用如下代码:

    string  remainder;getline(cin,remainder);

    因为要防止cin读取数据后,剩余的“换行符”。使用上面的语句将换行符吃掉。否则,下一句getline就只能得到换行了。

     ——update于2007-06-17 星期日15:21:50.14

     


     

    如果一个变量是在 全局域 定义的,那么系统会保证提控初始值0;如果是在 局部域 被定义的,则不会提供初始值,随机。

     ——update于2007-06-20 星期三22:16:24.56

     


     

    指针都会关联一个类型,不同类型的指针的区别不是在指针的表示上,也不是指针所持有的值上(所有类型的指针,这两点都是相同的)。不同之处在于指针所指的对象的类型上,指针的类型是告诉编译器怎样解释特定地址上的内存的内容的,以及该内存区域应该跨越多少内存单元!

    int   * pi  =   0 ;  //pi没有指向任何对象     double *pi2;     pi2 = 0; //pi2也没有指向任何对象     pi = pi2; //编译器报错,不同类型的指针,虽然pi和pi2可以同时为那个地址,但是对该地址上的内存存储分                    //布和内容的解释完全不一样,如果有这种赋相同地址值的需求的话,可以使用void *类型的指针!

     ——update于2007-06-20 星期三23:02:52.39

     


     

    静态成员函数和静态成员变量属于类本身,在类加载的时候,即为他们分配了空间,所以可以通过类名::函数名或类名:变量名来访问。对于非静态成员函数和变量属于对象的方法和数据!

    当然,上面的规则,也说明静态成员函数只能调用静态成员变量,而一般成员函数却随时可以调用静态成员函数,另外,需要注意的是,如果main程序有访问静态成员变量,那么这些变量必须初始化,否则会有报错!

     ——update于2007-07-02 星期一23:10:47.92

     


    在Unicode下,将CString 转换为 int的函数:_ttoi()。

    不过目前还不知道如何将CString 转换为 char *,看了baidu说是强制转换为(LPCTSTR)即可,可惜我的vs2005说是不能如此转换。 不过暂时无所谓了,因为我开始想如此转换的原因就是不知道上面的_ttoi(),一直想着使用atoi(),结果郁闷了很久!

     ——update于2007-07-08 星期日23:12:56.12

     


     

    在vs2005中,对话框类的WM_INITDIALOG消息哪里去了?

    百度告诉我,从vs2003开始,WM_INITDIALOG就被移到了重写里面,可以到重写中找OnInitDialog,重写即可!

     ——update于2007-07-09 星期一23:22:33.56

     


     

    传递一个对象的地址:

    希望一个类能够获得自定义的4个对象的地址,以便这4个对象之间互相访问。

    按照sunxin的教程,创建4个指向类对象的指针,直接在其他类的成员函数中,给这几个指针赋值。明显这种做法是把这几个指针声明为public类型。

    可是作为数据成员,也许我是受到《ccc》一书的影响,实在不喜欢将数据成员声明为public,于是便按照自己的想法,声明为private,并创建了其成员函数,使其能够返回类对象的指针:

    void  CMyButton::GetPtMyBtn1() {    m_pMybtn1 = this;} void  CMyButton::GetPtMyBtn2() {    m_pMybtn2 = this;} void  CMyButton::GetPtMyBtn3() {    m_pMybtn3 = this;} void  CMyButton::GetPtMyBtn4() {    m_pMybtn4 = this;}

     

    上面的做法明显存在问题,因为函数每次返回都是同一个对象的指针,而得不到其他3个类对象的地址。

    修改如下:

    void  CMyButton::GetPtMyBtn1(CMyButton &  mybtn) {    m_pMybtn1 = &mybtn;} void  CMyButton::GetPtMyBtn2(CMyButton &  mybtn) {    m_pMybtn2 = &mybtn;} void  CMyButton::GetPtMyBtn3(CMyButton &  mybtn) {    m_pMybtn3 = &mybtn;} void  CMyButton::GetPtMyBtn4(CMyButton &  mybtn) {    m_pMybtn4 = &mybtn;}

    这里就可以使得一个对象,通过调用这4个成员函数,取得4个不同对象的地址。

    但有一点一定要注意,这里参数类型要为:引用。否则的话,后果就是编译不过,因为这里你要传递的是地址!

    至于编译错误的原因,我还没有想通,先放在这里记录一下吧:

    “void CMyButton::GetPtMyBtn1(CMyButton)”: “CMyButton”中没有找到重载的成员函数”

     ——update于2007-07-12 星期四0:56:29.07

     


     

     

     

     


    最新回复(0)