明白了一点c++的东西,一一记下
2007-06-17 13:49
435 查看
这段时间养病,看小说累了,就将家里唯二的实体书之一(另一本至今还看不懂)《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
。
首先是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
。
相关文章推荐
- 记下一点东西吧,Sublime Text 3快捷方式:Ctrl + P,可以快速输入关键字以模糊匹配文件名
- Swift初学有一点难理解的东西,整理了一下,想明白了。
- C++ 中关于默认构造函数的一点困惑
- GSP:用C++写的像JSP一样的东西
- 关于指针的一点东西
- VBA的一点东西
- 想学IOS开发高阶一点的东西,从何开始
- 多线程的一点东西。。
- 更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
- c++模版的一点补充
- 建议19:明白在C++中如何使用C
- c转C++的一点感想
- 关于Enterprise library logging中一个没搞明白的东西,希望有大大们进来帮忙释疑一下, THKS
- 类内部存储的东西:太简洁了----小话c++(5)
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了(爱恨也交加的c++,让我不得不继续说下去)
- 手机网页制作需要注意的一点东西
- 分享如何学好C++的一点想法及给初学者的建议
- C++中的cin.get()和C中的getchar()要注意的一点
- c++关于排序与检索的一些简单东西
- c++的基本概念还是非常值得学习和使用的东西