分类 CPP 中的文章

C++11 特性:成员函数引用限定符(Reference qualifier)

1 引用限定符 学了这么多年C++,今天拜读了Scott Meyes的《more effective cpp》,第一次看到这种写法… 引用限定可以让成员函数只能被左值对象调用或者只能被右值对象调用。 下面举例说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 namespace left_value { class Hello { void show() & { std::cout << "just for left-value\n"; } }; inline void run() { Hello t; t.show(); // ok Hello{}.show(); // compile error: passing 'left_value::Hello' as 'this' argument discards qualifiers [-fpermissive] } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 namespace right_value { struct Test { void show() && { std::cout << " just for right value\n"; } }; inline void run() { Test t; t.show(); //compile error: passing 'right_value::Test' as 'this' argument discards qualifiers [-fpermissive] Test{}.show(); //ok } } 换句话说,引用限定所限定的就是*this,它可以让一些函数只被左值this调用或者右值……

阅读全文

C++11 explicit关键字

C++中的explicit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Test1 { public: Test1(int n) { num=n; }//普通构造函数 private: int num; }; class Test2 { public: explicit Test2(int n) { num=n; }//explicit(显式)构造函数 private: int num; }; int main() { Test1 t1=12; //隐式调用其构造函数,成功 Test2 t2=12; //编译错误,不能隐式调用其构造函数 Test2 t2(12); //显式调用成功 return 0; }……

阅读全文

深入理解C++11智能指针

1 Preface 软件工程遇到的问题都可以通过增加一个中间层来解决, 智能指针也是基于这样的思想; C++ 11 包含了以下 3 种常用的智能指针: std::unique_ptr std::shared_ptr std::weak_ptr 包含头文件 #include <memory> 即可 2 原理分析 2.1 shared_ptr 直接用 shared_ptr 管理一个堆上的裸指针对象: 1 std::shared_ptr<Good> gp1(new Good()); 2.2 weak_ptr weak_ptr类 和 shared_ptr类 的成员变量相同。 为什么需要 weak_ptr? 因为 shared_ptr 是对象的强引用, 一旦发生循环引用,对象就无法析构, 所以 weak_ptr 出现就是为了解决循环引用的问题。 打个不恰当的比喻:weak_ptr就像寄生虫,shared_ptr就是宿主。 weak_ptr 和 shared_ptr 内存结构相同(1 个原始对象指针 + ctrl_block_t 指针); 不同之处在于……

阅读全文

posix 进程 vs. 线程

进程和线程api对比 进程 线程 pid_t thread_t fork pthread_create waitpid pthread_jion exit pthread_exit 在main函数中调用return 在线程函数中调用return 僵进程 僵线程 wait_pid pthread_jion pthread_detach kill pthread_cancel 知识点 1 使用pthread_detach 方法脱离一个线程就不会产生僵线程。 2 获取当前县城id 3 pthread_cancel可以杀死一个执行中的线程。 线程结束 自杀: pthread_exit ,在线程入口函数中调用return. 他杀: pthread_cancel……

阅读全文

Linux 服务端编程(一)

ftok()函数 系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 函数原型:key_t ftok( const char * fname, int id ); (id>0) fname就是你指定的文件名(已经存在的文件名),一般使用当前目录。 在一般的UNIX实现中,是将文件的索引节点号取出。(文件重建将会分配一个新的索引节点号) ftok 返回值组成:hex(id)&0xff03 hex(节点号)&0xffff。 传入的id低8位+0x03+ 节点号的低16位。(test on redhat ) 可通过 ls -l 查看文件节点值。……

阅读全文

C++关于NULL、0、nullptr

一 关于NULL、0、nullptr 1 在C语言中NULL被定义为:一个void* 指针,指向的地址为0。 1 #define NULL ((void *)0) 所以在C语言中我们通常会写出如下语句 1 2 int *i = NULL; foo_t *f = NULL; 2 而在C++中,NULL会被定义为0 1 2 3 4 5 #ifndef __cplusplus #define NULL ((void *)0) #else /* C++ */ #define NULL 0 #endif 3 C++11引入了nullptr 来表示空指针 二 在C++中使用NULL的风险 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 //func1 int mycall(char *a, char *b) { cout<<"char pointer!"<<endl; } //func2 int mycall(char *a, int b) { cout<<"int !"<<endl; } // func3 int mycall(char *a,nullptr_t nullp) { cout<<"nullptr !"<<endl; } int main() { char *a,*b; mycall(a,b); //char pointer! //优先调用func2,没有func2则调用func1或fu……

阅读全文

最近文章

分类

友情链接

标签

其它