c++11新特性

cmake判断端操作系统类型,C/C++语言判断操作系统类型 在cmake或者C++代码中判断操作系统类型 阅读详情

1. auto

        自动推导变量类型,简化代码书写。

#include <iostream>
#include <type_traits>

#if defined(__linux__) || defined(__linux)
#include <cxxabi.h>
#define TYPE_NAME(var) abi::__cxa_demangle(typeid(var).name(), 0, 0, 0)
#else
#define TYPE_NAME(var) typeid(var).name()
#endif

void Test() {
  char a = 'A';
  auto aa = a;
  std::cout << "a,aa type: " << TYPE_NAME(a) << ", " << TYPE_NAME(aa) << std::endl;
  short b = 1;
  auto bb = b;
  std::cout << "b,bb type: " << TYPE_NAME(b) << ", " << TYPE_NAME(bb) << std::endl;
  int c = 1;
  auto cc = c;
  std::cout << "c,cc type: " << TYPE_NAME(c) << ", " << TYPE_NAME(cc) << std::endl;
  float d = 1.0f;
  auto dd = d;
  std::cout << "d,dd type: " << TYPE_NAME(d) << ", " << TYPE_NAME(dd) << std::endl;
  double e = 1.0;
  auto ee = e;
  std::cout << "e,ee type: " << TYPE_NAME(e) << ", " << TYPE_NAME(ee) << std::endl;
  long f = 1;
  auto ff = f;
  std::cout << "f,ff type: " << TYPE_NAME(f) << ", " << TYPE_NAME(ff) << std::endl;
  const long g = 1;
  auto gg = g;
  std::cout << "g,gg type: " << TYPE_NAME(g) << ", " << TYPE_NAME(gg) << std::endl;
  char h[10] = {0};
  auto hh = h;
  std::cout << "h,hh type: " << TYPE_NAME(h) << ", " << TYPE_NAME(hh) << std::endl;
  int *i = nullptr;
  auto ii = i;
  std::cout << "i,ii type: " << TYPE_NAME(i) << ", " << TYPE_NAME(ii) << std::endl;
  const int *j = nullptr;
  auto jj = j;
  std::cout << "j,jj type: " << TYPE_NAME(j) << ", " << TYPE_NAME(jj) << std::endl;
  const int *const k = nullptr;
  auto kk = k;
  std::cout << "k,kk type: " << TYPE_NAME(k) << ", " << TYPE_NAME(kk) << std::endl;
  int &l = c;
  auto ll = l;
  std::cout << "l,ll type: " << TYPE_NAME(l) << ", " << TYPE_NAME(ll) << std::endl;
  const int &m = c;
  auto mm = m;
  std::cout << "m,mm type: " << TYPE_NAME(m) << ", " << TYPE_NAME(mm) << std::endl;
  int &&n = 1;
  auto nn = n;
  std::cout << "n,nn type: " << TYPE_NAME(n) << ", " << TYPE_NAME(nn) << std::endl;
  const int &&o = 1;
  auto oo = o;
  std::cout << "o,oo type: " << TYPE_NAME(o) << ", " << TYPE_NAME(oo) << std::endl;
  const int *&p = j;
  auto pp = p;
  std::cout << "p,pp type: " << TYPE_NAME(p) << ", " << TYPE_NAME(pp) << std::endl;
  const int *q = j;
  const auto &qq = j;
  std::cout << "q,qq type: " << TYPE_NAME(q) << ", " << TYPE_NAME(qq) << std::endl;
}

int main(int argc, char *argv[]) {
  std::cout << "Hello World" << std::endl;

  Test();
  return 0;
}

执行结果:

Hello World
a,aa type: char, char
b,bb type: short, short
c,cc type: int, int
d,dd type: float, float
e,ee type: double, double
f,ff type: long, long
g,gg type: long, long
h,hh type: char [10], char*
i,ii type: int*, int*
j,jj type: int const*, int const*
k,kk type: int const*, int const*
l,ll type: int, int
m,mm type: int, int
n,nn type: int, int
o,oo type: int, int
p,pp type: int const*, int const*
q,qq type: int const*, int const*

2. decltype

        推导实体的声明类型,或表达式的类型和值类别。

#include <iostream>
#include <type_traits>

#if defined(__linux__) || defined(__linux)
#include <cxxabi.h>
#define TYPE_NAME(var) abi::__cxa_demangle(typeid(var).name(), 0, 0, 0)
#else
#define TYPE_NAME(var) typeid(var).name()
#endif

struct A {
  double x;
};

const int &GetRef(const int *p) { return *p; }
auto Add(int a, int b) -> decltype(a + b) { return a + b; }

void Test() {
  int a = 33;
  decltype(a) b = a * 2;
  std::cout << "a,b type: " << TYPE_NAME(a) << ", " << TYPE_NAME(b)
            << std::endl;

  const A *c = nullptr;
  decltype(c->x) d;
  decltype((c->x)) e = d;
  std::cout << "d,e type: " << TYPE_NAME(d) << ", " << TYPE_NAME(e)
            << std::endl;

  const int *const f = &a;
  decltype(f) g = &b;
  std::cout << "f,g type: " << TYPE_NAME(f) << ", " << TYPE_NAME(g)
            << std::endl;

  int &aref = a;
  decltype(aref) h = a;
  decltype(Add(10, 20)) i;
  std::cout << "h,i type: " << TYPE_NAME(f) << ", " << TYPE_NAME(g)
            << std::endl;
}

执行结果

a,b type: int, int
d,e type: double, double
f,g type: int const*, int const*
h,i type: int const*, int const*

3. default & delete

        由开发者控制函数由编译器创建(default)或禁止创建(delete),用于构造、析构系列函数。

class A {
  A() = delete;
  A(const A &) = default;
  A(A &&) = default;
  A &operator=(const A &) = default;
  A &operator=(A &&) = delete;
  ~A() = default;
};

4. final & override

        final 用于指定某个虚函数不能在派生类中被重写,或者某个类不能被派生;override指定一个虚函数重写另一个虚函数,用于派生类虚函数重写了基类某个虚函数,如果没有重写编译报错。

#include <iostream>
#include <string>

struct A final { 
  virtual void Print(const std::string &str) { std::cout << str << std::endl; }
}
#include <iostream>
#include <string>

struct A {
  A() = default;
  virtual void Print(const std::string &str) final {
    std::cout << "A " << str << std::endl;
  }
  virtual void Print2(const std::string &str) {
    std::cout << "A2 " << str << std::endl;
  }
};

struct B : public A {
  B() : A() {}
  virtual void Print2(const std::string &str) override {
    std::cout << "B2 " << str << std::endl;
  }
};

void Test() {
  A a;
  a.Print("a invoke");
  a.Print2("a invoke 2");

  B b;
  b.Print("B invoke");
  b.Print2("b invoke 2");

  A *c = new B();
  c->Print("c invoke");
  c->Print2("c invoke 2");
  delete c;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

5. 尾随返回类型

        当返回类型取决于实参名时或当返回类型复杂时,尾随返回类型很有用。

#include <iostream>

template <class T, class U> auto Add(T t, U u) -> decltype(t + u) {
  return t + u;
}

void Test() {
  int a = 10;
  double b = 20;
  std::cout << "a + b = " << Add(a, b) << std::endl;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

执行结果

a + b = 30

6. 右值引用

  1. 左值:可修改的变量或表达式。
  2. 右值:常量、表达式等不能出现在等式左边。
  3. 左值引用(&):左值变量的引用别名,传统的引用都是左值。
  4. 右值引用(&&):右值变量的引用别名,一般只能引用右值,可使用std::move转化为右值,实现移动语义。
  5. 完美转发:不修改传递的变量或表达式语义,进行完整的语义传递,即左值参数传递后还是左值,左右参数传递后还是右值。
#include <iostream>

void Test() {
  int a = 10;   // a 左值, 10右值
  int &aa = a;  // aa 左值引用
  int &&aaa = std::move(a); // aaa 右值引用,此时 a 在后边作用域内无意义

  int b = 0;
  int &bb = b;
  int &&bbb = std::move(b);

  const int c = 20;
  const int &cc = c;
  // int &&ccc = std::move(c);

  const int &d = bbb; // const 修饰的引用可以是左值、也可以是右值
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}
void Func(const int&& x) { cout << "const 右值引用" << endl; }
 
template<typename T>
void Test(T&& t)
{
	// Func(t); //没有使用forward保持其右值的属性,退化为左值
	Func(std::forward<T>(t));  // 使用 std::forward 实现完美转发
}

7. 移动构造

        移动构造函数是一种构造函数,可以提供一个相同类类型实参调用,并复制该实参的内容,有可能会修改实参。

struct A {
  A() = default;
  ~A() = default;
  A(const A &) { std::cout << "A(const A&)" << std::endl; }
  A(A &&) { std::cout << "A(A&&)" << std::endl; }
  A(const A &&) { std::cout << "const A(A&&)" << std::endl; }
  A(const volatile A &&) { std::cout << "const volatile A(A&&)" << std::endl; }
  A(A &&, int num) { std::cout << "A(A&&), num = " << num << std::endl; }

  int x = 10;
};

void Test() {
  A a;
  A b = a;
  A bb = std::move(a);
  const A c; // 只读变量
  A d = std::move(c);

  const volatile A e; // 只读变量
  A f = std::move(e);

  a.x = 20;
  std::cout << "a.x = " << a.x << std::endl;
  b.x = 30;
  std::cout << "b.x = " << b.x << std::endl;
  bb.x = 40;
  std::cout << "bb.x = " << bb.x << std::endl;
  d.x = 60;
  std::cout << "d.x = " << d.x << std::endl;
  f.x = 80;
  std::cout << "f.x = " << f.x << std::endl;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

执行结果

A(const A&)
A(A&&)
const A(A&&)
const volatile A(A&&)
a.x = 20
b.x = 30
bb.x = 40
d.x = 60
f.x = 80

8. 移动赋值运算符

        移动赋值运算符是名字是 operator= 的非模板非静态成员函数,可以提供一个相同类类型实参调用,并复制该实参的内容,有可能会修改实参。

#include <iostream>

struct A {
  A() = default;
  ~A() = default;
  A &operator=(const A &) {
    std::cout << "A &operator=(const A &)" << std::endl;
  }
  A &operator=(A &&) { std::cout << "A &operator=(A &&)" << std::endl; }
  A &operator=(const A &&) {
    std::cout << "A &operator=(const A &&)" << std::endl;
  }

  int x = 10;
};

void Test() {
  A a;
  a.x = 20;

  A b;
  b = a;
  // const A c = a;  // 复制构造函数

  A d;
  d = std::move(a);
  // const A e = std::move(a);  // 复制构造函数

  a.x = 20;
  std::cout << "a.x = " << a.x << std::endl;
  b.x = 30;
  std::cout << "b.x = " << b.x << std::endl;
  d.x = 60;
  std::cout << "d.x = " << d.x << std::endl;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

执行结果

A &operator=(const A &)
A &operator=(A &&)
a.x = 20
b.x = 30
d.x = 60

9. 作用域枚举

        枚举 是一种独立的类型,它的值被限制在一个取值范围内(细节见下文),它可以包含数个明确命名的常量(“枚举项”)。各常量的值是某个整数类型(称为该枚举的底层类型)的值。枚举的大小、值表示和对齐要求与它的底层类型相同。而且枚举的每个值都与该枚举的底层类型的对应值有着相同的表示。

#include <iostream>

enum EnumColor { kRed = 0, kGreen, kBlue };
enum class EnumClassColor { kRed = 3, kGreen, kBlue };
enum class EnumClassColorType : int { kRed = 6, kGreen, kBlue };

void Test() {
  std::cout << "EnumColor: " << EnumColor::kRed << ", " << kGreen << ", "
            << kBlue << std::endl;
  std::cout << "EnumClassColor: " << int(EnumClassColor::kRed) << ", "
            << int(EnumClassColor::kGreen) << ", " << int(EnumClassColor::kBlue)
            << std::endl;
  std::cout << "EnumClassColorType: " << int(EnumClassColorType::kRed) << ", "
            << int(EnumClassColorType::kGreen) << ", "
            << int(EnumClassColorType::kBlue) << std::endl;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

执行结果

EnumColor: 0, 1, 2
EnumClassColor: 3, 4, 5
EnumClassColorType: 6, 7, 8

10. constexpr

        指定变量或函数的值可以在常量表达式中出现,必须初始化。字面类型是constexpr类型拥有的类型,且能通过constexpr函数构造、操作及返回它们。

#include <iostream>

constexpr int Ret() { return 0; }
constexpr bool b2 = noexcept(Ret()); // true,f() 是常量表达式

constexpr int Add() { return 10 + 20; }

static constexpr char *COLOR[3]{"kRed", "kGreen", "kBlue"};

void Test() {
  constexpr int NUM = 10;
  static constexpr int NUM2 = 20;
  static constexpr int const NUM3 = 30;
  static constexpr int const &NUM4 = 40;
  constexpr int ARR[2] = {0, 1};
  std::cout << "Add: " << Add() << std::endl; // 30
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

11. 列表初始化

         从花括号包围的初始化器列表列表初始化对象,默认std::initializer_list类为构造参数。C++98中,标准允许使用花括号{}对数组元素进行统一的列表初始值设定。C++98对于自定义类型,无法使用列表初始化。

#include <iostream>
#include <map>
#include <vector>

struct A {
  A(int a, int b) {}

private:
  int m_a;
  int m_b;
};

void Test() {

  int arr1[5]{1, 2, 3, 4, 5};
  int arr2[]{1, 2, 3, 4, 5};

  int *arr3 = new int[5]{1, 2, 3, 4, 5}; // 动态数组,在C++98中不支持

  std::vector<int> v{1, 2, 3, 4, 5};
  std::map<int, int> m{{1, 1}, {2, 2}, {3, 3}, {4, 4}};

  delete[] arr3;

  int a = 1 + 3;
  int b = {1 + 3};
  int c{1 + 3};

  A d = {4, 5};
  A e{6, 7};
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

12. 委托构造 & 继承构造

        如果类自身的名字在初始化器列表中作为类或标识符 出现,那么该列表只能由这一个成员初始化器组成;这种构造函数被称为委托构造函数,而构造函数列表的仅有成员所选择的构造函数是目标构造函数。此时首先由重载决议选择目标构造函数并予以执行,然后控制返回到委托构造函数并执行其函数体。委托构造函数不能递归。

        c++语言当中的继承关系,只有虚函数可以被继承,而构造函数不可以是虚函数,所以构造函数不能被继承,但是我们可以通过某种手段,达到继承效果

class A
{
public: 
    A(char x, int y) {}
    A(int y) : A('a', y) {} // A(int) 委托到 A(char, int)
};
#include <iostream>

struct A {
  A(int a, int b, int c) {}
};

struct B : A {
  using A::A;
  int m_a;
};

void Test() {
  A a(1, 2, 3);
  B b(1, 2, 3); // 调用 A 构造函数, 未初始化 m_a
  // B c;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

13. nullptr

        关键词 nullptr 代表指针字面量。它是std::nullptr_t类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括std::nullptr_t的值,以及宏 NULL。

#include <type_traits>
#include <iostream>

#if defined(__linux__) || defined(__linux)
#include <cxxabi.h>
#define TYPE_NAME(var) abi::__cxa_demangle(typeid(var).name(), 0, 0, 0)
#else
#define TYPE_NAME(var) typeid(var).name()
#endif


void Test() {
  std::nullptr_t ptr = nullptr;
  std::cout << "ptr type: " << TYPE_NAME(ptr) << std::endl;

  int *ptr2 = nullptr;
  std::cout << "ptr2 type: " << TYPE_NAME(ptr2) << std::endl;
}

int main(int argc, char *argv[]) {
  Test();
  return 0;
}

执行输出

ptr type: decltype(nullptr)
ptr2 type: int*

14. long long类型

        long long - 目标类型将有至少 64 位的宽度。具体与平台架构实现相关,long类型规定大于等于32位宽度。

15. char16_t & char32_t

        char16_t - UTF-16 字符表示的类型,要求大到足以表示任何 UTF-16 编码单元(16 位)。它与std::uint_least16_t具有相同的大小、符号性和对齐,但它是独立的类型。

        char32_t - UTF-32 字符表示的类型,要求大到足以表示任何 UTF-32 编码单元(32 位)。它与std::uint_least32_t具有相同的大小、符号性和对齐,但它是独立的类型。

16. 类型别名

        类型别名是指代先前定义的类型的名字(类似 typedef)。别名模版是指代一族类型的名字。

#include <iostream>
#include <string>
#include <type_traits>
#include <typeinfo>

// 类型别名,等同于 typedef std::ios_base::fmtflags flags;
using flags = std::ios_base::fmtflags;
flags fl = std::ios_base::dec;

// 类型别名,等同于 typedef void (*func)(int, int);
using func = void (*)(int, int);
void example(int, int) {}
func f = example;

// 别名模板
template <class T> using ptr = T *;
ptr<int> x;

// 用于隐藏模板形参的别名模版
template <class CharT>
using mystring = std::basic_string<CharT, std::char_traits<CharT>>;
mystring<char> str;

// 别名模板可引入成员 typedef 名
template <typename T> struct Container { using value_type = T; };

// 可用于泛型编程
template <typename ContainerType> void info(const ContainerType &c) {
  typename ContainerType::value_type T;
  std::cout << "ContainerType 是 `" << TYPE_NAME(typeid(decltype(c)).name())
            << "`\n"
               "value_type 是 `"
            << typeid(T).name() << "`\n";
}

// 用于简化 std::enable_if 语法的类型别名
template <typename T> using Invoke = typename T::type;

template <typename Condition>
using EnableIf = Invoke<std::enable_if<Condition::value>>;

template <typename T, typename = EnableIf<std::is_polymorphic<T>>>
int fpoly_only(T) {
  return 1;
}

struct S {
  virtual ~S() {}
};

int main() {
  Container<int> c;
  info(c); // Container::value_type 将在此函数中是 int
  //  fpoly_only(c); // 错误:被 enable_if 禁止
  S s;
  fpoly_only(s); // OK:被 enable_if 允许
}

执行结果

ContainerType 是 `char const*`
value_type 是 `i`

17. 可变参模板

        模板形参包是接受零个或更多个模板实参(非类型、类型或模板)的模板形参。函数形参包是接受零个或更多个函数实参的函数形参。至少有一个形参包的模板被称作变参模板。

#include <iostream>
 
void tprintf(const char* format) // 基础函数
{
    std::cout << format;
}
 
template<typename T, typename... Targs>
void tprintf(const char* format, T value, Targs... Fargs) // 递归变参函数
{
    for (; *format != '\0'; format++)
    {
        if ( *format == '%' )
        {
            std::cout << value;
            tprintf(format + 1, Fargs...); // 递归调用
            return;
        }
        std::cout << *format;
    }
}
 
int main()
{
    tprintf("% world% %\n", "Hello", '!', 123);
}

执行结果

Hello world! 123

C++之std::type_info::name查看变量数据类型typeid().name() 摘自:cpp_reference 阅读详情

相关推荐

模型量化必知:Per-Tensor和Per-Channel到底怎么选?

本文深入解析了模型量化中Per-Tensor与Per-Channel两种核心策略的抉择。Per-Tensor量化实现简单、硬件兼容性极佳,适合激活值或分布均匀的权重;而Per-Channel量化精度更高,能更好地处理权重分布不均的卷积层,是现代CNN权重量化的主流。文章提供了从硬件平台、数值分布到精度需求的实战决策框架,并推荐了“权重Per-Channel,激活Per-Tensor”的混合量化最佳实践。

assembly8low的博客 983

c++ 操作系统检测

来源:itas109的窗口程序 * Blog : http://blog.youkuaiyun.com/itas109 * Github : https://github.com/itas109 #ifndef OSPLATFORMUTIL_H #define OSPLATFORMUTIL_H /* The operating system, must be one of: (I_OS_x) DARWIN - Any Darwin system (macOS, iOS, watchO...

破晓的专栏 700

一步一步搭建S32K14x的AutoSar项目----S32DS 代码工程的搭建

一步一步搭建S32K14X的AutoSar项目----S32DS代码工程的搭建

wo580231的博客 3488

C++代码中的平台判断

C++代码中判断各个平台

sinat_31425585的博客 829

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1729

两轮差速机器人运动学模型

两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器人; 3、无人仓AGV小车; 4、轮椅; 底盘主要特点: 1、控制简单、里程计计算简单。 2、只能给定X方向速度、Z轴方向角速度。 1.2、底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器人本身约束方程(物理特性) 图1.2.2 a 左侧是车的两个

su_fei_ma_su的博客 3万+

跨平台编译

1、使用CMake进行跨平台 cmake(6):适配多种操作系统编译构建以及if命令_翔底的博客-优快云博客_cmake if(unix) 如何写出优雅的跨平台的C/C++代码_芥末的无奈的博客-优快云博客 2、标志位 // a.cpp #include "a.h" #ifdef _WIN32_ void print_something() { printf("_WIN32_"); } #ifdef _LINUX_ void print_something() { pri

Liuqz2009的专栏 1893

从C-EPS到DP-EPS:手把手图解不同EPS类型怎么选,对你的车操控感影响有多大?

方向盘转动时那股细腻的阻尼感,高速过弯时令人安心的沉稳,或是狭窄车位里一根手指就能拨动的轻盈——这些看似微妙的差异,其实都源自转向系统电机那几厘米的安装位置变化。当我们谈论驾驶乐趣时,发动机参数和悬架调校总是占据C位,但真正连接驾驶者与车辆的神经末梢,恰恰是那套默默工作的电动助力转向系统(EPS)。不同EPS类型带来的操控特性差异,可能比马力数字更能定义一辆车的性格。

weixin_30920513的博客 531

CPP——C++ 11的新特性

本文转载自: http://www.yanjiankang.cn/cpp_11_new_feature/ Lambda 表达式 Lambda 表达式就是用于创建匿名函数的。 为什么说 lambda 表达式如此激动人心呢?举一个例子。标准 C++ 库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 和 find()。这些函数通常需要提供一个“谓词函数 predicate functi...

Monster_ixx的博客 488

手把手教你完成基于cnn的手写数字识别系统MATLAB语言

手写数字识别是经典的 CNN 分类应用之一,常用的数据集就是 MNIST 手写数字数据集,包含 0~9 这 10 个数字的手写图片,每个数字都由 6 万幅训练图像和 1 万幅测试图像构成。为了便于直观分析,这里选择 MATLAB 工具箱提供的 DigitDataset 进行训练识别,读者也可以直接利用 MNIST 数据集或者自己设计的数据集进行实验。其中,数据集文件夹 db 如图 所示。在数据集文件夹 db 里面对每个数字都建立了子文件夹,各自包含 1000 幅 28×28 大小的二维灰度图像。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1368

车载以太网测试-1【TC8物理层测试基础】

车载以太网物理层是车载网络的基础,负责将数字数据转换为适合在物理介质上传输的信号,并确保数据传输的可靠性、稳定性和高效性。它在车载网络系统中扮演着至关重要的角色,直接影响着车辆内部通信的性能和效率。1. 主要物理层标准车载以太网标准由IEEE 802.3和标准名称速率线缆类型编码方式应用场景100BASE-T1100 Mbps单对非屏蔽双绞线车载摄像头、传感器1 Gbps单对屏蔽/非屏蔽双绞线自动驾驶域控制器、高清视频10BASE-T1S10 Mbps单对双绞线幅移键控(ASK)

车载网络测试工程师的博客 4392

【面试知识整理】CPP——C++ 11的新特性

【面试知识整理】CPP——C++ 11的新特性作者yanhealth发表于2017-02-12原创文章,转载请注明: 转载自:严健康的个人博客 http://www.yanjiankang.cn/本文链接地址: http://www.yanjiankang.cn/cpp_11_new_feature/Lambda 表达式Lambda 表达式就是用于创建匿名函数的。为什么说 lambda 表达式如此...

caogenwangbaoqiang的博客 1万+

Halcon那些事:Halcon非常核心的1个概念reduce_domain算子的理解和1个详细的使用示例

Reduce是减少的意思。并不是真的去裁剪图像,而是定义一个“感兴趣的区域(Region of Interest, ROI)”。后续的图像处理算子将只在这个定义的区域内有效,区域外的像素将被忽略。在一张白纸(完整图像)上放一张镂空的纸板(Domain)。我们后续的绘画(图像处理操作)只会透过镂空的部分影响到下面的白纸。镂空纸板之外的部分保持不变,也不会被处理。关键步骤:使用ReduceDomain,将图像的域限制为ROI区域,图像在原来图像基础上存在图像区域。

十多年IT经验,专注机器视觉,智能制造半导体行业 577

Cpp::C++11新特性入门(29)

哈喽,结束了C++最难的部分,现在我们又要迎来奖励关卡了!C++11同C++98都是C++历史上比较大的一个版本,现在我们来学习一下它吧!C++11文档介绍奖励关卡结束啦,下一篇我们就要来上难度了!

tan180°的博客 2021

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c++ 常用新特性总结【c++11】,【c++14】,【c++17】,【c++20】

一文总结了c++常见的新特性,在c++推出的新特性中,c++11无疑是最具影响力的,其次是c++17与c++14。

Ray 6228

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C++】C++11新特性的讲解

C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03C++11。

Sxy_wspsby的博客 1243

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++11新特性

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 C++11标准在2011年正式发布,相信使用过C++11新特性的小伙伴一定会被她的魅力深深地吸引,感觉是用C++写出了Python、写出了kotlin这种高级又简便的语言。博主个人非常喜欢11标准,为了方便个人查阅以及分享给好友,整理了一些特性,如有不对欢迎指出。 C++11的设计目标 使C+...

billy的博客 1748

【C++】:C++11新特性

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于。

优快云官方认证C/C++研发领域优质创作者 优快云官方2023年成都赛道Top3 第16届蓝桥杯C/C++软件赛四川赛区二等奖 带你玩转C/C++ 数据结构与算法 Linux系统编程/Linux网络编程 MySQL数据库 软件测试开发 1065

【C++】——C++11新特性

C++,这门在系统开发、游戏开发、嵌入式等众多领域都占据主导地位的编程语言,一直在不断进化。C++11就像是C++家族中的一颗璀璨明星,闪耀着无数令人惊叹的新特性。如果你还在使用传统的C++编码方式,那你可能正在错过许多现代编程的便捷与高效。想象一下,用更少的代码编写出性能更高的程序,轻松应对复杂的并发场景,还能享受更加简洁和安全的内存管理。C++11就能让这一切成为现实。在这篇博文中,我会一点点揭开C++11新特性的神秘面纱,让你看到C++在这次重大更新之后所蕴含的无限潜力。

2402_85267481的博客 1875

【C++】C++11新特性

无需再拷贝一份,大大提升效率。例如某个函数返回对象时,寄存器需要有临时对象来接受,此时会调用一次拷贝构造函数,此时该临时需要赋值给新的接受对象则需要再调用一次拷贝构造,效率低下,使用右值引用寄存器中的临时对象进行语义转化,新对象接受时不用调用拷贝构造函数。,auto_ptr、unique_ptr、shared_ptr这三个智能指针模板类都定义了类似指针的对象,可以将new获得的地址赋给这种对象,当智能指针过期时,的方式,当引用计数为0时才进行析构,很好的解决了该问题,旧指针和新指针都可以使用。

csdnabcaq的博客 2103

C++11-C++17新特性介绍

本篇只包含c++11- c++17的新特性, 一些c++基本规定不再赘述前文c++规定记录了c++基本规定对于这些新特性,笔者一边学习一边做笔记,所以内容有待完善笔者使用的是 Clion+MinGW 开发环境提示:以下是本篇文章正文内容,下面案例可供参考using 覆盖了 typedef 的全部功能// 重定义unsigned int// 重定义std::map//定义函数类型和模板的结合使用// ...别名模板(alias template)

Computer_Tech的博客 2629

c++11新特性总结

11。

m0_74803679的博客 201

C++11新特性总结

C++11引入了许多新特性,如auto关键字实现自动类型推导,nullptr代替NULL,智能指针如unique_ptr和shared_ptr更安全地管理内存,lambda表达式简化函数对象的书写,委托构造函数和默认删除函数增强了类的构造与析构控制,移动语义提高了效率,变长参数模板variadic templates支持可变数量的参数类型。这些特性大大提高了C++的易用性和性能,并使得代码更简洁、安全、高效。

白云之道 1328

【cpp进阶】c++11的新特性(概述版)

C++11是C++历史上最重要的更新,它通过移动语义、智能指针、Lambda、自动类型推导等特性,让C++在保持C级性能的同时,获得了Rust/Python级的生产力,实现了语言的现代化重生。 这就是C++11的故事——一个关于性能、安全、生产力三者兼得的传奇。

2301_80127108的博客 1050

C++ 11 新特性

lambda表达式(&:引用传递,所在类的this,所有可见的局部变量,相当于传递所有局部变量,同&this;=:值传递;)。 可变参数模板 template void showlist(Args... args){}。 原子操作( atomic==》 atomic a1(0); )。 nullptr、 智能指针(std::unique_ptr和std::shared_ptr和weak_ptr) auto关键字等。

huijielic的博客 711
上一篇: Golang基础-13
下一篇: c++11新特性
无夜_
博客等级 码龄7年 2916粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值