Skip to the content.

动态内存

auto x = new auto(obj); // auto, 利用 obj 的类型初始化 x
int * p = new arrT; // 利用 arrT 的类型初始化 p
const string  * s = new const string; // const object
int * p2 = new(nothrow) int; // placement new
class A {
public:
  A(int x, int y) {
    cout << x << "-- " << y << endl;
  }
};

int main(int argc, char *argv[]) {
  A * a = new A[10](1, 2); // 错误,这不是值初始化
  int * b = new int[10]; // 10 个没有初始化的 int
  int * c = new int[10](); // 10 个 0
  string * d = new string[10]; // 10 个空 string
  string * e = new string[10](); // 10 个空 string
  return 0;
}
class A {
public:
  A(int x, int y) { cout << x << "-- " << y << endl; }
  A(int x) { cout << x << endl; }
  A() { cout << "default" << endl; }
};

int main(int argc, char *argv[]) {
  auto a = new A[10]{1, 2, 3};
  return 0;
}
1
2
3
default
default
default
default
default
default
default

lambda

lambda 的唯一挑战应该就在于数值捕获吧 可能你还不太会使用 Lambda,基本形式如下:

[](argument1,argument2,.....)-> return_type {//code}

在 () 中传入参数,在 {} 中编写代码,[] 是一个捕获列表,可以指定外部作用域中,可以使用的局部变量:

  1. [] — 捕获列表为空,表示在 lambda 表达式中不能使用任何外部作用域的局部变量,只能使用传进去的参数。
  2. [=] — 表示按照值传递的方法捕获父作用域的所有变量。
  3. [&] — 表示按照引用传递的方法捕获父作用域的所有变量。
  4. [this] — 在成员函数中,按照值传递的方法捕获 this 指针。
  5. [a, &b] — 不建议直接使用 [=] 或 [&] 捕获所有变量,可以按需显式捕获,就是在 [] 指定变量名,[a] 表示值传递,[&b] 表示引用传递。

operator

除了函数调用 operator() 之外,其他的重载运算符不能含有默认实参

因为 string 将 + 定义为非成员函数,所以 “hi” + s 等价于 operator+("hi", s);

  string s="fadf";
  s = operator+("hi", s);

输入输出运算符必须是非成员函数,如果想要输出非 public 成员,还需要将 IO 类声明为 friend

为什么 = [] -> 必须是 member function

箭头运算符的限定

使用 function 来解决不同类型具有相同的调用形式。

面向对象程序设计

15.7

class A {
public:
  A(const A &a) { cout << "A copy" << endl; }
  A(int x) : _x(x) {}
  A() : _x(100) {}
  int get() { return _x; }

private:
  int _x;
};

class B : public A {
public:
  B(const B &b) : A(b) { cout << "B copy" << endl; }
  B(B &&b) : A(std::move(b)) { cout << "B move" << endl; }
  // B(B &&b) { cout << "B move" << endl; } // 这会导致 base 部分没有 move 而是默认初始化
  B(int x) : A(x) {}
};

int main(int argc, char *argv[]) {
  B a(12);

  B b(a);
  vector<B> v;
  v.push_back(std::move(b));
  cout << v[0].get();
  return 0;
}

template

using namespace std;

template <typename T, typename U> class A {
public:
  T a;
  static T x;
};

template <typename T, typename U> T A<T, U>::x = 1;

int main(int argc, char *argv[]) {
  A<int, int> x;
  A<int, int> x1;
  A<int, double> y;

  x.x = 12;
  cout << x.x << endl;
  cout << x1.x << endl;
  cout << y.x << endl;

  return 0;
}

template <typename T, typename U> class A { public: T a; template void compare(X x); };

template <typename T, typename U> template void A<T, U>::compare(X x){ cout << "so complex template" << endl; }

int main(int argc, char *argv[]) { A<int, int> a; a.compare(12); // 可以要,也可以去掉

return 0; }

- 对于实例化声明,必须存在一个 explicit 的实例化定义

- [ ] 16.1.6 中间描述关于 unique_ptr 和 shared_ptr 的内容,比较迷惑,等到回头理解了动态内存分配相关的内容再说吧

- 如果形参是 reference ,那么数组不会被转换为指针, 下面的代码正确,但是数组 a b 的长度应该保证。
```cpp
template <typename T> void gg(T &a, T &b) {
  cout << "array reference" << endl;
}

int main(int argc, char *argv[]) {
  int a[12];
  int b[12];
  gg(a, b);
  return 0;
}

用于大型程序的工具

class A {
private:
  void get() { cout << "c" << endl; }
};

class B {
public:
  void get() { cout << "c" << endl; }
};

class C : public A, public B {};

int main(int argc, char *argv[]) {
  C c;

  c.B::get();
  return 0;
}

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。