1、字符串原始字面量
R“()”用于取消转义,可用于路径表示
运行成功
这两个RawValue起到描述作用(可以不写),并不参与输出
注意,这里输出中文乱码
2、nullptr
NULL在C++中表示0,在非C++中表示万能指针
nullptr是空指针,而不是0,能兼容各种类型的指针,但为空
3、constexpr
在定义常量时,const与constexpr是等价的
constexpr修饰函数时,函数应尽可能精简:
1、不能出现非常量表达式之外的语句(using指令、typedef指令、static_assert、return语句除外)
例如,不能出现for循环
场景:简单的计算
4、auto 与 decltype 类型推导
auto不能去定义数组:
auto a[10] = { 1, 2, 3 };//为错误写法
auto推导的对象必须声明和赋值同时进行,例如auto a = 3;而不能直接auto a;因为是通过这个3来推导a的类型的,而decltype不需要
在UE4中:
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "list"
#include "iostream"
#include "GlobeAwareDefaultPawn.h"
#include "GlobeAwareActor.generated.h"UCLASS()
class UNREALEARTHLIBRARY_API AGlobeAwareActor : public AGlobeAwareDefaultPawn
{GENERATED_BODY()public: // Sets default values for this actor's propertiesAGlobeAwareActor();virtual void BeginPlay() override;private:std::list<int> int_list;
};template<typename T>
class Test {
public:void Print(T a) {for (templateIter = a.begin(); templateIter != a.end(); templateIter++) {PrintNumOnScreen(*templateIter);}}void PrintNumOnScreen(FString str) {GEngine->AddOnScreeenDebugMessage(-1, 10.f, FColor::Red, str);}void PrintNumOnScreen(int value) {GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::FromInt(value));}
private:decltype(T().begin()) templateIter;
};
// Fill out your copyright notice in the Description page of Project Settings.#include "GlobeAwareActor.h"AGlobeAwareActor::AGlobeAwareActor()
{// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;int_list = { 1, 2, 3, 4 };
}void AGlobeAwareActor::BeginPlay() {Super::BeginPlay();Test<std::list<int>> *test = new Test<std::list<int>>();test->Print(int_list);
}
编译成功,运行效果如下:
当T没有构造函数时,需要对函数进行返回值后置:这里以TArray<int>为例
auto Function->decltype(TArray<int>) {}
5、final修饰的函数,不能虚函数重写、继承,正确用法如下:
这时候继承自Child过后就不能对test方法进行重写了,俗话说的好,final断子绝孙,嗯,好记
在Child类后面加final,之后类就不能被继承了
6、override
如果B类继承自A类,B类型想定义一个与A类一模一样的方法,若A类的该方法有virtual修饰,那么该行为为重写,若没有virtual修饰,叫覆盖,若只是方法名意义,其余不一样,则叫重载
7、尖括号
例如原来TArray<list<int>> a,这里的>>会有歧义,4>>2的运算符号,之前必须TArray<list<int> > a加个空格来区别,而c++11过后就可以写成TArray<list<int>> a了
8、模板默认类型
不只是可以通过传递类型进行类型确定,也可以传递对象参数进行类型推导,如上
9、using功能
①命名空间
使用场景:在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
using namespace std;
②定义类型别名 (和typedef意义)
using MY_INT = int ;
typedef int MY_INT;
总结:using看起来更直观