C++问题总结之二

碰到问题就要记录下来,防止遗忘吧。

一、VS中的命令行参数

今天在运行代码的时候,碰都了下面的情况:

 // 解析命令行参数
 if (pcl::console::find_argument (argc, argv, "-h") >= 0)
 {
   printUsage (argv[0]);
   return 0;
 }

我可能是不够熟悉VS中的命令行参数输入的设置,所以到网上搜了半天*_*,不过最后还是找到了,如下图所示:

在这里插入图片描述

二、内联函数和宏

宏的实现主要依赖于C预处理器的工作,但是预处理器的一个很大的缺点就是它并不了解C++语言的代码规范,也就是它只能进行简单的文本替换;所以为了使得宏能够被合理的运用到C++程序中去,就出现了内联函数,而他与原来的宏之间最大的区别在于“内联函数”是由C编译器来实现的,这就解决了宏只是形似函数的问题,因为编译器了解C++代码规范,它是以函数来运行还是以内联函数(宏)的形式来运行就看编译器来怎么选择了,我们只需要将函数声明为inline即可。因此,在C++中我们应永远不使用宏,只使用内联函数。

任何在类中定义的函数自动地成为内联函数,但也可以使用inline关键字放在类外定义的函数前面使之成为内联函数。但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待。形如:

inline int max(int x,int y);

inline int max(int x,int y)
{
	return x>y?x:y;
}

内联代码的确占用空间,但假如函数较小,这实际上比为了一个普通函数调用而产生的代码(参数压栈和执行CALL)占用的空间还少。
在头文件里,内联函数默认为内部连接——即它是 static,并且只能在它被包含的编译单元看到。因而,只要它们不在相同的编译单元中声明,在内联函数和全局函数之间用同样的名字也不会在连接时产生冲突(类似于重载)。

总的来说,就是内联函数其实就是“懂得C++代码规范的宏”,而且内联函数还有个好处就是我们只管声明内联函数inline即可,使不使用它由编译器来进行决定。

三、初始化和赋值

很长时间我都认为初始化和赋值是一样的,但是其实并不是。在类中,初始化的实现在进入构造函数之前,而赋值则是进入构造函数之后(这里一般指非内置类型object C++)。所以可以使用成员初始化列表来初始化成员变量,而不是构造函数。

	point(int x,int y)
		:x(x),y(y)		//使用初始化列表对成员变量进行初始化,未进入构造函数中
	{
	}

	point(int x,int y)
	{
		x=x;		//使用赋值的方法对成员变量进行赋值,需要进入构造函数中
		y=y;
	}

参考书籍:《C++编程思想》《Effective C++》

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...