CE-RTI开源软件代码学习笔记(一)

    xiaoxiao2021-03-25  82

    CERTI为本人第一次接触的开源软件,使用c++写的,作为一个一致从事c++工作的人来说,发现在看它的源代码时,感觉自己以前写的代码简直就是小学生写的。撇开代码中的与RTI相关的类和操作之外,c++本身自带的类、操作、或者技术都有许多不甚了解之处,甚感汗颜。故特此对在代码中遇到的c++相关技术做些记录,算是重新学习一下c++,深入的了解c++。

    1、int main(int argc, char *argv[])

    当刚看到这句话的时候,是没有什么感觉的,因为从刚开始接触c++以来就经常见到这句话,只当它是所有c++程序的开头罢了,当我看到接下来的代码中在利用()里面的参数时,我是懵圈的,我才发现我竟然不了解这句话的意思。

    main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。

    C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。

    由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

    DOS提示符下命令行的一般形式为: C:\>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在 位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。例如有命令行为: C:\>e24 BASIC dbase FORTRAN由于文件名e24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予,其中第0个参数是程序的全名。其表示如下所示: main(int argc,char *argv){ while(argc-->1) printf("%s\n",*++argv); } 本例是显示命令行中输入的参数如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。 因此输入的命令行为: C:\>e24 BASIC dBASE FORTRAN  则运行结果为: BASIC dBASE FORTRAN

    一般情况下,在windows下不太常用,只是在Linux程序中用的较多。

    2、getenv()\putenv()

    getenv(const char* varName):获取环境变量名称varName的环境变量的值

    putenv(const char* varString):将当前的环境变量varString添加的环境中,设置的环境仅对程序本身有效,不会反映到外部环境

    3、std::signal(SIGINT, SignalHandler);

    signal函数原型:

    void (*signal (int sig, void (*func)(int)))(int);

    第一个参数为 整数,标识信号号码;第二个参数标识 一个指向信号处理函数的指针,即第二格参数其实是一个函数指针;

    参考文档:http://wiki.jikexueyuan.com/project/cplusplus/signal-handling.html

    http://blog.csdn.net/ta893115871/article/details/7475095

    不过,signal函数大部分情况下是用在unix下,windows下的编程很少用到。

    4、std::set_new_handler(NewHandler);

    std有一个set_new_handler函数,它接受和返回一个new_handler类型,用于设置当前当使用new操作符无法分配足够内存时而抛出bad_alloc异常的处理函数。new_handler其实是一个void (void)函数,你可以在头文件<new>中看到它的typedef:typedef void(*new_handler)();

    所以std::set_new_handler其实是接受一个不接受参数也无返回值的函数的函数指针。而这个函数就被用来处理bad_alloc异常。

    这句话的意思就可以理解为:当程序中的new操作或着new[]操作失败时,将调用NewHandler指向的函数。

    5、select()

    select()函数:确定一个或多个套接口(Socket)的状态,对于每一个套接口,调用者可以查询它的可读性、可写性及错误状态信息。用fd_set结构来标识一组等待检查的套接口,在调用返回时,这格结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd_set的操作,这些宏与unix软件中的兼容,但内部的表达是完全不同的。

    select()是属于一个比较大的范畴了,而且又分windows和unix的区别,具体资料不再此骜述,具体资料可参考一下资料:

    http://blog.csdn.net/pugu12/article/details/46863715

    http://blog.csdn.net/leo115/article/details/8097143

    http://www.cnblogs.com/renyuan/p/5100184.html

    http://blog.sina.com.cn/s/blog_4900f3fb0100k20a.html

    6、std::auto_ptr<>

    auto_ptr是一个模板类,定义如下:

    template <typename Type> class auto_ptr {...};

    它存储的是一个指向Type的指针。

    顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存。

     auto_ptr构造函数:std::auto_ptr<Billard> billard(createBillard(args.demo_given, args.demo_arg, federate));

    这句话的意思就是,用auto_ptr定义了一个Billard类的一个实例billard,同时为Billard的构造函数传递了参数 createBillard(args.demo_given, args.demo_arg, federate)的返回值

    参考文章:http://blog.csdn.net/monkey_d_meng/article/details/5901392

    http://blog.163.com/hbu_lijian/blog/static/126129153201242124741769/  

    7、构造函数初始化

    构造函数初始化成员变量有两种方式,一是传统的方式,即;

    CSomeClass::CSomeClass()  {x=0;  y=1; }

    还有一种是采用成员初始化列表的形式:

    CSomeClass::CSomeClass() : x(0), y(1) 

    采用成员初始化列表的形式有两格原因:

    第一:当初始化另一个类的成员。如:

    class CMyClass {  CMember m_member;  public:  CMyClass();  };  //必须使用成员初始化列表  CMyClass::CMyClass() : m_member(2)  ...

    没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。  第二:基于效率的考虑,不再骜述。

    需要说明的是,成员初始化列表是按照在类中成员声明的顺序进行初始化的,而不是按照在成员初始化列表里面定义的顺序。

    参考文章:http://blog.csdn.net/ianchoi/article/details/6917899

    8、std::vector<std::string>

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

    为了可以使用vector,必须在你的头文件中包含下面的代码:

    #include <vector>

    vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

    using std::vector;

    或者连在一起,使用全名:

    std::vector;

    建议使用全局的命名域方式:

    using namespace std;

    在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。

    参考文章:http://blog.csdn.net/zhoujiaxq/article/details/9787341

    https://ceeji.net/blog/cpp-std-vector/

    http://blog.csdn.net/infoworld/article/details/15736305

    转载请注明原文地址: https://ju.6miu.com/read-19789.html

    最新回复(0)