C++学习日记4

2017-01-11

1. const_cast <new_type> (expression) [1]

解析:const_cast转换符用来移除变量的const或volatile限定符。如下所示:

(1)常量指针被转化成非常量指针,并且仍然指向原来的对象。比如,const A *pca1 = new A; A *pa2 = 

const_cast<A*>(pca1);

(2)常量引用被转换成非常量引用,并且仍然指向原来的对象。比如,const A &a1 = a0; A a2 = const_cast<A&>(a1);

(3)常量对象被转换成非常量对象(错误)。 比如,const A ca; A a = const_cast<A>(ca);(错误)

(4)添加const属性。比如,const int *k = const_cast<const int*>(j);和const int *m = j;

说明:使用const_cast去掉const属性,其实并不是真的改变原类类型(或基本类型)的const属性,它只是又提供了一

个接口(指针或引用),可以通过这个接口来改变类型的值。使用const_case添加const属性,也是提供了一个接口,

来不让修改其值。


2. VS 2013和Boost 1.6.2 [2]

解析:

(1)附加包含目录:D:\boost_1_62_0

(2)附加库目录:D:\boost_1_62_0\stage\lib

在VS 2013工程中,添加C/C++工程中外部头文件及库的基本步骤,如下所示:[4]

(1)添加工程的头文件目录:工程 --> 属性 --> 配置属性 --> C/C++ --> 常规 --> 附加包含目录:加上头文件存放目录。

(2)添加文件引用的lib静态库路径:工程 --> 属性 --> 配置属性 --> 链接器 --> 常规 --> 附加库目录:加上lib文件存放目录。

(3)添加工程引用的lib文件名:工程 --> 属性 --> 配置属性 --> 链接器 --> 输入 --> 附加依赖项:加上lib文件名。

(4)添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下。

说明:b2.exe、bjam.exe这两个exe的作用是一样的,只不过bjam.exe是老版本,b2是bjam的升级版本。


3. VS 2013和Boost.Python [3][5] 

解析:Boost::Python库是Python和C++相互交互的框架,它是对Python/C API的包装,可以在Python中调用C++的类

和方法,也可以让C++调用Python的类和方法。Python是一个动态类型的语言,C++是一个静态类型的语言,对于

Python中的变量类型,Boost.Python都有相应的类对应。

(1)编译Boost.Python

执行命令bjam --with-python link=shared runtime-link=shared address-model=64,在目录D:\boost_1_62_0\stage\lib

下面生成boost_python-vc120-mt-1_62.dll,boost_python-vc120-mt-1_62.lib,boost_python-vc120-mt-gd-1_62.dll,

boost_python-vc120-mt-gd-1_62.lib四个文件。如果报错fatal error C1001:编译器中发生内部错误,那么将VS 2013升

级到VS 2013 Update 5。[7]

(2)使用VS 2013生成dll文件

使用VS 2013新建一个Win32 DLL项目,然后设置项目属性:包含目录D:\boost_1_62_0,D:\boost_1_62_0\libs,

D:\Program Files\Anaconda2\include,库目录D:\boost_1_62_0\stage\lib,D:\Program Files\Anaconda2\libs,并且

不启用最小重新生成,不使用预编译头。

(3)Python调用C++

将生成的dll文件改为pyd文件,并将boost_python-vc120-mt-gd-1_62.dll和pyd文件复制到Python项目的根目录。[8][9]

说明:通过Boost.Python模块(也是对Python/C API的封装),C++可为Python编写扩展模块。通过Python/C API,

Python可为C++提供脚本接口。[10]


4. chrono、ratio和ctime等头文件 [6]

解析:

(1)#include <chrono>:日期和时间。

(2)#include <ctime>:日期和时间。

(3)#include <ratio>:比例关系。

(4)#include <typeinfo>:运行时类型信息(RTTI)。


5. 两种遍历host_vector<int>方式

解析:

(1)常规方式

for (int i = 0; i < h_vec.size(); i++) {
	cout << h_vec[i] << endl;
}
(2)迭代器方式
for (host_vector<int>::iterator i = h_vec.begin(); i != h_vec.end(); i++)
{
	cout << *i << endl;
}


6. volatile关键字 

解析:volatile关键字确保本条指令不会因编译器的优化而省略,而且要求每次直接读值。


7. extern "C"

解析:extern "C"的主要作用是为了能够正确实现C++代码调用其它C语言代码。加上extern "C"后,会指示编译器这

部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参

数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会

带上函数的参数类型,一般只包括函数名。


8. C++ 11中auto功能 [11]

解析:自动类型推断;返回值占位。


9. assert宏

解析:assert()是宏,而不是函数。在C的#include<assert.h>头文件中,其作用是如果它的条件返回错误,则终止程

序执行。如下所示:

#include <stdio.h>      
#include <assert.h>     

void print_number(int* myInt) {
	assert(myInt != NULL);
	printf("%d\n", *myInt);
}

int main()
{
	int a = 10;
	int * b = NULL;
	int * c = NULL;

	b = &a;

	print_number(b);
	print_number(c);

	return 0;
}

10. inline关键字

解析:关键字inline必须与函数定义体放在一起才能使函数成为内联函数,仅将inline放在函数声明前面不起任何作

用。不宜使用内联函数,如下所示:

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。


11. exit()函数  

解析:exit(1)是异常退出,exit(0)是正常退出。


12. C++三法则

解析:如果类定义下列其中一个函数,那么也需要其它两个函数,如下所示:

(1)析构函数(Destructor)

(2)复制构造函数(copy constructor)

(3)复制赋值运算符(copy assignment operator)


13. POD类型 

解析:POD是Plain Old Data的缩写,它是一个struct或者类,且不包含构造函数、析构函数以及虚函数。


14. 虚函数,纯虚函数,虚基类与虚继承

解析:

(1)虚函数:定义一个函数为虚函数,不代表函数为不被实现的函数。定义它为虚函数是为了允许用基类的指针来

调用子类的这个函数。

(2)纯虚函数:定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个

规范的作用,规范继承这个类的程序员必须实现这个函数。


15. std::shared_ptr

解析:std::shared_ptr定义于头文件 <memory>中,template< class T > class shared_ptr; std::shared_ptr是通过指针

保持某个对象的共享拥有权的智能指针。若干个shared_ptr对象可以拥有同一个对象;最后一个指向该对象的

shared_ptr被销毁或重置时,该对象被销毁。销毁该对象时使用的是delete表达式或者是在构造shared_ptr时传入的自

定义删除器(deleter)。shared_ptr也可以不拥有对象,称作空(empty)。shared_ptr满足CopyConstructible和

CopyAssignable的要求。


16. explicit specifier

解析:在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。通过将构造函数声明为

explicit(显式)的方式可以抑制隐式转换,也就是explicit构造函数必须显式调用。如下所示:

struct A {
    A ( int ) {}
    operator int() const { return 0; }
};
 
struct B {
    explicit B(int) {}
    explicit operator int() const { return 0; }
};
 
int main() {
    // A is has no explicit ctor / conversion, everything is fine
    A a1 = 1;
    A a2 ( 2 );
    A a3 { 3 };
    int na1 = a1;
    int na2 = static_cast<int>( a1 );
 
    B b1 = 1; // Error: implicit conversion from int to B
    B b2 ( 2 ); // OK: explicit constructor call
    B b3 { 3 }; // OK: explicit constructor call
    int nb1 = b2; // Error: implicit conversion from B to int
    int nb2 = static_cast<int>( b2 ); // OK: explicit cast
}

说明:explicit class_name ( params );explicit operator type ( ) (C++11起)。


17. boost::mutex 

解析:Boost线程库提供了6种互斥体类型:boost::mutex;boost::try_mutex;boost::timed_mutex;

boost::recursive_mutex;boost::recursive_try_mutex;boost::recursive_timed_mutex。boost库中提供了mutex类与

lock类,通过组合可以轻易的构建读写锁与互斥锁。如下所示:

(1)mutex对象类:mutex类主要有两种:boost::mutex,boost::shared_mutex,其中mutex有lock和unlock方法,

shared_mutex除了提供lock和unlock方法外,还有shared_lock和shared_unlock方法。因此,boost::mutex为独占互

斥类,boost::shared_mutex为共享互斥类。

(2)lock模板类:boost::unique_lock,boost::shared_lock,其中unique_lock为独占锁,shared_lock为共享锁。

unique_lock中的T可为mutex类中的任意一种,如果为shared_mutex,那么boost::unique_lock类的对象构造函数构

造时,会自动调用shared_mutex的shared_lock方法,析构函数里会自动调用shared_mutex的shared_unlock方法。

如果boost:: unique_lock,则分别自动调用lock和unlock方法。boost::shared_lock中的T只能是shared_mutex类。


参考文献:

[1] C++类型转换详解const_cast:http://blog.csdn.net/lwbeyond/article/details/6213382

[2] 在VS2013中安装配置boost_1_58_0库:http://blog.csdn.net/a249900679/article/details/50961852

[3] Boost.Python初级教程:http://blog.csdn.net/lainegates/article/details/8008414

[4] VC包含目录、附加依赖项、库目录及具体设置:http://www.cnblogs.com/MuyouSome/p/3380134.html

[5] Boost.Python:http://www.boost.org/doc/libs/1_62_0/libs/python/doc/html/index.html

[6] C++的chrono、ratio和ctime等头文件:http://lib.csdn.net/article/operatingsystem/19036

[7] Boost安装出错,遇到“编译器中发生内部错误”的解决方法:http://blog.csdn.net/alpine_climbing/article/details/52621528

[8] VS2013 + Python + Boost.Python实现Python调用C++方法:http://evanstone.blog.51cto.com/9615170/1583366

[9] 基于VS2015 X64的Boost.Python环境搭建:http://m.blog.csdn.net/article/details?id=52014741

[10] Python/C API Reference Manual:https://docs.python.org/2.7/c-api/index.html

[11] C++11新特性auto的使用:http://blog.csdn.net/huang_xw/article/details/8760403



注明:本文章属于转载,仅供行业人员学习交流使用,文章版权属于原创作者,在此向原创者致敬,感谢原创作者为大家学习交流提供精品内容。

站方声明:IThao123是为广大互联网从业者免费提供学习交流的平台,如果侵犯了原创著作权,请联系站方删除,给你带来不便,深表歉意。

顶部