一些C++知识:
带参宏与带参函数区别
宏的定义形式:
#define 宏名称,替代文本
(注意有的需要加上括号,防止展开出错)
1.宏在编译器对源码进行编译时进行简单替换,不会进行任何逻辑检测,仅仅是简单复制代码。
2.宏进行定义时不会考虑参数的类型。
3.会增加代码长度
4.参数宏定运行速度比函数快,因为不需要参数压栈/出栈操作,函数反之(宏,优)
5.函数只在目标文件中存在一处,,比较节省程序空间(函数,优)
6.函数的参数存在传值和传地址的问题,参数宏不存在。
内联函数和宏的区别:
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数时真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
main函数的返回值和参数
参考博客:https://blog.youkuaiyun.com/akwolf/article/details/7909398
返回值类型:
void main(),其实这是错误的
C++98中定义了如下两种main函数的定义方式:
int main()
int main(int argc,char *argv[])
C++之父Bjarne Stroustrup 在他的主页上的FAQ中明确地写着The definition void main(){/…/} is not and nerver has been C++,nor has it even been C.
“The C programming Language(《C程序设计语言》)用的就是main()"
这是因为第一版的C语言只有一种类型,那就是int,没有char,没有long,没有float,…既然只有一种类型,那么就可以不写。后来的改进版为了兼容以前的代码于是规定:不明确标明返回值的,默认返回值为int,也就是说main()等同于int main(),而不是void main()。在C99中,标准要求编译器至少给main()这种用法来个警告。
main函数的返回值类型必须是int ,这样返回值才能传递给程序的激活者(如操作系统)
如果main函数的最后没有写return 语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return 0;,表示程序正常退出。
不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0;
总结:
void main主函数没有返回值
main默认为int型,即int main(),返回整数。
注意,新标准不允许使用默认返回值,即int不能省,而且对应main函数不再支持void型返回值,因此为了使程序有很好的移植性,强烈建议使用:
int main()
{
return 0;
}
C++11 关键字 override
作用:
在成员函数声明或定义中,override 确保该函数为虚函数并覆写来自基类的虚函数。
位置:
函数调用运算符之后,函数体或纯虚函数标识"= 0"之前。
例子:
class Base
{
public:
virtual void goo{ ..... }
};
class Derived :public Base
{
public:
void gao{ .... } //想重写goo,却错误的将goo写成了gao
};
C/C++ 关键字 register
原博客地址:https://blog.youkuaiyun.com/m0_37717595/article/details/79615775
在早期c语言编译器不会对代码进行优化,因此使用register关键字修饰变量是很好的补充,大大提高的速度。
register关键字请求让编译器将变量a直接放入寄存器里面,以提高读取速度,在C语言中register关键字修饰的变量不可以被取地址,但是c++中进行了优化。
c++中依然支持register关键字,但是c++编译器也有自己的优化方式,即某些变量不用register关键字进行修饰,编译器也会将多次连续使用的变量优化放入寄存器中,例如入for循环的循环变量i。
c++中也可以对register修饰的变量取地址,不过c++编译器发现程序中需要取register关键字修饰的变量的地址时,register关键字的声明将变得无效。
类型兼容
不同类型数据之间在一定条件下可以进行类型的转换,比如int n=‘a’ 由于字符和整型兼容,可以对整形变量n赋值为字符‘a’ 。基类与派生类对象之间也具有赋值兼容的关系,可以进行类型间的转换。
派生类是从它的直接和间接基类继承而来,尤其是公有继承的派生类保持了基类的所有特征。因此,在语法上,一个公有派生类总是可以充当一个基类对象,可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其派生类对象代替。反之则不成立,因为派生类是对基类的继承和发展,其中既包含基类的成员又包含派生类增加的新成员。
C++中一个空类的大小为什么是1
深度探索c++对象模型中是这样说的:
那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址。
也就是说这个char是用来标识类的不同对象的