Piccolo中的C++语法

很久没用C++了,趁着过年跟家鑫碰面,找了一些Piccolo上的看着难懂的C++语法请教他,记录一下。


【文件名及后缀】
之前一直都以为C++的所有文件都必须是.h 或者.cpp为后缀,却到看到工程有无后缀和带.为前缀的文件名。

 

1.其实文件有无后缀,后缀叫什么,前缀叫什么对编译器来说是一样的。

2.编译器之所以能找到.h和.cpp中声明和定义的对应关系,并不是这2个文件同前缀名,而是编译器会把所有带有定义的文件(通常来说即.cpp)编在一起,据说是在makefile中配置。

3..h和.cpp起到的作用,其实是把声明和定义分离,因为C++只允许定义一次变量和函数,声明则可以多次,所以把声明放在.h中,把定义放在.cpp中,通过只include头文件来避免多次定义。

4.#include是一个宏,本质是从外部获取文件内容并替换本行(参考https://blog.csdn.net/Linear_Luo/article/details/52695562),即可以include .h也可以include .cpp,只要保证不会重定义就行(#pragma once)。

5.单独把.h用来放声明的另一好处,是同一功能在多平台上实现不同时,可以把不同的实现放在不同命名的.cpp中,而公用.h,如Runtime_win32.cpp、Runtime_andriod.cpp。

【extern】

 

 

这里有2个全局变量,在.cpp中定义,在.h中声明,声明前面加了extern。

在这里extern的作用,是提醒编译器这里变量只是“声明”而非“定义”,如果不加编译器会默认赋初始值。

用法:一般这种全局变量,在很多头文件和.cpp中都用到,只需要在其中一个.cpp中定义,其他头文件extern声明即可。

【namespace】

namespace 给类或变量加上“上级”,这样当作用域内有同名类或变量时,就可以通过“上级::”区分了。

using namespace 把这个“上级”的所有“下属”曝光在作用域中,如果是在文件最外层using namespace,则这个文件和include了它的文件都可以访问到namespace中的内容。

【泛型 模板】

1.template<typename T> 和 template<class T> 是等价的。

 

 

 以上定义的作用是什么呢?跟template<typename T, typename U>有什么不同?

1.<>中有几个参数, 在使用的时候就要对应传几种类型,如果定义的是template<typename T, typename U>,则在成员函数做int和float不同类型的操作时,需要<int, float>都传进去以识别,类型很多而每次都这样传很不便利;

2.类似如下的“移动拷贝”函数,需要拿到另外一个对象的私有成员变量:

 

基于以上两个原因,用过定义自己的类为友元,并在上面加上另外一个template类型,便可达到目的。

 【shared_ptr】

1.跟传统指针相比,智能指针内部除了会指向数据外,还会指向一个引用计数;

2.当有新shared_ptr对象跟智能指针关联时,在新对象的构造函数中会使引用计数+1;

3.当关联的shared_ptr对象销毁时(离开作用域),在对象的析构函数会使引用计数-1;

4.当引用计数为0时,shared_ptr调用delete释放内存。

参考 https://blog.csdn.net/shaosunrise/article/details/85228823

【模板元编程】

C++ Template Metaprogramming(TMP),利用C++的模板进行编程

 

 

 

 

 

TMP在编译期就把值计算出来,为常量值。

TMP的作用:

1.提高运行时效率。把运行时的计算提前到编译期,类型于渲染中的“烘焙”。如以上的代码 is_safely_castable,对不同的模板类型,在编译器就可以实现“判断安全转型”;

2.TMP 可以对类型(type)做计算;

3.TMP 可以使代码变得简洁优美。

参考 https://zhuanlan.zhihu.com/p/378356824

posted @ 2023-01-26 22:44  银龙背上的骑士  阅读(40)  评论(0编辑  收藏  举报