首页 > 编程语言 >Piccolo中的C++语法

Piccolo中的C++语法

时间:2023-01-26 22:56:00浏览次数:49  
标签:定义 Piccolo C++ 语法 编译器 cpp include 声明

很久没用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

标签:定义,Piccolo,C++,语法,编译器,cpp,include,声明
From: https://www.cnblogs.com/alphaGo/p/17067961.html

相关文章

  • C++类型擦除
    以线程池举例线程池需要接收要执行的任务,这些任务需要形成一个队列任务可以是函数,lambda,重载括号运算符的类那么在定义一个数组去保存这些任务该如何定义?classmy_thre......
  • C++Day12 虚拟继承内存布局测试
    测试一、虚继承与继承的区别1.1单个继承,不带虚函数1>classBsize(8):1>+---1>0|+---(baseclassA)1>0||_ia//4B1......
  • 快速幂c++
    是求(a^b)modp如果用暴力解法O(b)点击查看TLE代码c++#include<iostream>usingnamespacestd;intmain(){inta,b,p;longlongres=1;cin>>a>>b>......
  • C++可变参数模板
    template<class...T>voidf(T...args){cout<<sizeof...(args)<<endl;}sizeof...一整个是运算符可以通过递归或逗号表达式方式展开该参数包可以使用这种可......
  • 【C++ OOP 02 对象的初始化和清理】构造/析构函数、深/浅拷贝、初始化列表以及静态成
    【对象的初始化和清理】生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全C++中的面向对象来源于生活,每个对象也都会有......
  • C++中的指针和引用
    指针在C++,指针本质上也是一个对象,它存储的是对象的地址,而非值本身。是一个有趣且功能强大的特性。指针的定义指针的定义,使用"*"进行修饰一个变量。int*p1,*p2如上,定......
  • C/C++程序是怎么运行的?
    一个C/C++程序运行经历的过程:预处理、编译、汇编、链接、执行。【注】其中源程序、修改了的源程序和汇编程序都是文本文件,而可重定位目标程序和可执行目标程序都是二进制......
  • c++ 数组
              ......
  • MarkDown语法学习
    Markdown学习标题一级标题:#+空格+标题二级标题:##+空格+标题以此类推字体斜体:星+字+星粗体:星星+字+星星斜体加粗:星星星+字+星星星删除线:波浪线波浪线+字+波浪线......
  • 力扣只出现一次的数字系列总结(C++)
    tags:LeetCodeC++DSA写在前面最近用到的异或运算越来越多了,而其中又以只出现一次的数字为经典题型,下面总结总结一下只出现一次的数字系列.代码均为C++.前置知识逻辑......