1. 一切c++的成员函数编译好以后最终都是C函数(这个表述可能不太准确),静态非静态的区别在于编译后的函数是否带一个隐藏的this参数。
class Foo
{
void A(){}; //== Foo::A(Foo* this)
static void a(){}; //== Foo::a()
};
2. boost库中sleep有两个方法:
1>. 这个方法只能在线程中用, 在主线程中用无效.
原型:
void sleep(TimeDuration const& rel_time);
void sleep(system_time const& abs_time);
实例:
boost::this_thread::sleep(boost::posix_time::seconds(2)); // 这种更好用
boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::seconds(2));
2>. 在主线程中使用
原型:
sleep(const system_time& xt);
实例:
boost::thread::sleep(boost::get_system_time() + boost::posix_time::seconds(5));
3. printf按8进制、16进制输出
printf()8进制、16进制输出格式控制:
int num = 0x9;
/*输出4位8进制的num*/
printf("%04o/n",num);
/*输出2位16进制的num*/
printf("%02X",num);
结果:
0011
09
4. error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
原因:
纯c要求局部变量定义必须在函数或局部空间的开头,然后才能有其他语句。vs是严格执行了纯C的标准。变量任意定义是c99的标准。
解决方案:
将所有要使用的变量先在函数开始的部分声明。
5. C++的匿名对象只在当行代码有用,离开当行代码立马析构了。
6. 像Boost库这类库文件内容,一般分为两种,一种是 .hpp 文件,这类是模板库,不需要编译,使用时直接包含头文件;另一类就是需要编译后使用的,如其中的线程库,system库,time库等。
7. vs2008 sp1添加了TR1, 开始支持如下内容:
Smart pointers
Regular expression parsing
New containers (tuple, array, unordered set, etc)
Sophisticated random number generators
Polymorphic function wrappers
Type traits
下载链接: 英文 http://www.microsoft.com/en-us/download/details.aspx?id=6922
中文 https://www.microsoft.com/zh-cn/download/details.aspx?id=10986
8. 两个头文件需要互相包含的解决办法:①改变设计架构;②在头文件中先声明需要使用的另一个头文件中类的名称
9. 报错:error: expected ';', ',' or ')' before '&' token
我在函数中使用了引用,而且是在C版本下编程。 错误原因是:C语言没有“传引用”这个用法。
10. printf ( "% 10.8s", buf );
其中10是输出字符总长度,不够用空格补充,8是输出 buf 中字符的长度,如 buf 中有10个字符,则只会输出 buf 的前8个字符。实现左对齐,空格后面加 “-”,printf ( "% -10.8s", buf );
11. STL源码中对Namespace的条件编译 ( 转载 )
现代程序猿们对Namespace(命名空间)的使用已经习以为常了,而且现在的编译器对Namespace肯定都有比较好的支持。但是有没有想过在很遥远的某个年代,当时编译器并不支持Namespace?这种情况当然是存在的,所以为了保持向后兼容性,STL中使用了条件编译。
最近读STL源码(SGI版本)的时候发现了一种很奇怪的情况:有些头文件中包含了“__STL_BEGIN_NAMESPACE”和“__STL_END_NAMESPACE”这样不伦不类的语句,而且编辑器在下面加上了下划线,显然是编辑器所不能解析的。
在网上搜索了一下,发现原因如下:
#ifndef __SGI_STL_INTERNAL_ITERATOR_H
#define __SGI_STL_INTERNAL_ITERATOR_H
__STL_BEGIN_NAMESPACE
struct input_iterator_tag {};
。。。。。。。。。。。。
这段代码来自sgi stl中 stl_iterator.h
请问各位高手,这段代码中的__STL_BEGIN_NAMESPACE是干什么用的,放在这里不会出错吗?
答案1:
看stl_config.h:
00205 # if defined(__STL_USE_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
00206 # define __STD std
00207 # define __STL_BEGIN_NAMESPACE namespace std {
00208 # define __STL_END_NAMESPACE }
00209 # define __STL_USE_NAMESPACE_FOR_RELOPS
00210 # define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
00211 # define __STL_END_RELOPS_NAMESPACE }
00212 # define __STD_RELOPS std
00213 # else
00214 # define __STD
00215 # define __STL_BEGIN_NAMESPACE
00216 # define __STL_END_NAMESPACE
00217 # undef __STL_USE_NAMESPACE_FOR_RELOPS
00218 # define __STL_BEGIN_RELOPS_NAMESPACE
00219 # define __STL_END_RELOPS_NAMESPACE
00220 # define __STD_RELOPS
00221 # endif
在支持namespace的环境下,配合__STL_END_NAMESPACE使用namespace std
namespace std{ //__STL_BEGIN_NAMESPACE
...
} //__STL_END_NAMESPACE
答案2:
__STL_BEGIN_NAMESPACE宏是在某个配置文件中定义的,就sgi来说,此宏为了兼容一些早期代码,允许stl模板库不是用std命名空间包裹,__STL_BEGIN_NAMESPACE根据用户配置,被定义为“空”或者“namespace std {”之类的实际代码。
我查看了一下,在STL所有底层文件中(以"stl_"开始的头文件)几乎都含有这两个宏,文件开始时会包含“__STL_BEGIN_NAMESPACE”,结尾处会包含“__STL_END_NAMESPACE”。这样,在支持Namespace的用户环境下会被转换成 namespace std { },在不支持Namespace的用户环境下会被忽略。
12. namespace 用法实例
namespace my_space {
class my_class {
void func ();
}
}
int main () {
my_space::my_class A_instance;
A_instance.func();
......
}
13. 假设有一个数组int a[10],当访问数组时,a[1]相当于*(a+1),而数组名相当于数组首元素首地址,而&a在数值上虽然与a的值相同,但是&a从含义上讲是代表整个数组的首地址(类型为整个数组),因此&a + 1操作将跨域整个数组的长度,因此(&a)[1]并不是访问a[1],(*(&a))[1]才是访问a[1]。
14. C++中define中的 # 和 ##
#是字符串化的意思,出现在宏定义中的#是把跟在后面的参数转成一个字符串;
#define strcpy__(dst, src) strcpy(dst, #src)
strcpy__(buff,abc) 相当于 strcpy__(buff,“abc”)
##是连接符号,把参数连接在一起
#define FUN(arg) my##arg
则 FUN(ABC) 等价于 myABC
15. C语言结构体里面也可以包含函数,如同类中有方法一样,但是不能通过直接放过一个函数进去,需要通过函数指针的方式,同时,关于类的构造函数与析构函数C语言表示是没有的,需要你自己手动解决这些问题。
16. (1) “引用传递做函数参数”是C++的特性,C语言不支持,同时C语言中也没有参数默认值的概念。
(2) 千万不要返回局部对象的引用
const string &mainip(const string &s)
{
string ret=s;
return ret;
}
当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。
同理,指针也是这样,返回指针的时候,不能指向局部临时变量,否则指针将变为野指针;
17.