C++小知识

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.

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值