首页 秋招复盘8.3:C加加
文章
取消

秋招复盘8.3:C加加

cpp数组、指针、下标运算符

1
2
		int a[2][3] = {{0, 1, 2}, {3, 4, 5}};
    cout << *(&a[0] + 1)[1] << endl;

编译错误或者奇怪的输出:

  1. a[0] 是多维数组的第一个元素,它是一个包含3个整数的数组 {0, 1, 2}
  2. &a[0] 是指向 a[0] 的指针,实际类型是 (*int)[3] 类型,也就是指向包含3个整数的数组的指针。
  3. &a[0] + 1 是将指向第一个元素的指针向后移动一个位置,指向下一个元素,也就是 {3, 4, 5}
  4. (&a[0] + 1)[1] 这里是错误的,因为 (&a[0] + 1) 这部分已经是指向 {3, 4, 5} 的指针,再用 [1] 去取值,超出了数组的范围。

    补充:下标运算符实际上是对指针进行运算的一种便捷方式。例如,对于指针 p,表达式 p[i] 实际上等价于 *(p + i)。所以,(&a[0] + 1)[1] 实际上等价于 *(&a[0] + 2),这会导致访问数组越界。

想要取二维数组的第二行第二列的元素,正确访问:*(*(a+1) + 1), 即a[1][1].

类模板

复习:C++11模板 新特性:第 2 章 语言可用性的强化 现代 C++ 教程: 高速上手 C++ 11/14/17/20 - Modern C++ Tutorial: C++ 11/14/17/20 On the Fly (changkun.de)

C++ 类模板有许多高级用法,包括模板特化、非类型参数、模板成员函数和嵌套模板类等。

  1. 模板特化:你可以为模板定义特化版本,这是一种特殊的模板定义,用于特定的类型参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
class MyTemplate {
public:
    void print() { std::cout << "General template\\n"; }
};

template <>
class MyTemplate<int> {
public:
    void print() { std::cout << "Specialization for int\\n"; }
};

int main() {
    MyTemplate<char> a;
    a.print();  // 输出 "General template"

    MyTemplate<int> b;
    b.print();  // 输出 "Specialization for int"
}

  1. 非类型参数:模板参数不仅可以是类型,还可以是值。
1
2
3
4
5
6
template <typename T, int SIZE>
class MyArray {
    T data[SIZE];
    // ...
};

  1. 模板成员函数:类的成员函数也可以是模板,即使类本身不是模板。
1
2
3
4
5
6
7
8
class MyClass {
public:
    template <typename T>
    void doSomething(T value) {
        // ...
    }
};

  1. 嵌套模板类:模板类可以嵌套在其他类或模板类中。
1
2
3
4
5
6
7
8
template <typename T>
class OuterClass {
public:
    template <typename U>
    class InnerClass {
        // ...
    };
};

字面字符串(literal string)

1
2
3
4
		const char *s = "123";
    char *p = (char*)s;
    p[0] = 'a';
    cout << s << endl;

有些编译器可能会出现编译错误,没编译错误的话可能运行时错误。

试图改变一个字符串字面量的内容,这是未定义行为(Undefined Behavior)

在 C++ 中,字符串字面量(如 “123”)是常量,它们存储在程序的只读内存部分。试图通过指针修改它们的值将导致未定义行为。在某些情况下,这可能会导致程序崩溃。

本文由作者按照 CC BY 4.0 进行授权

秋招复盘8.10:cpp、碎碎念

秋招复盘9.25:随便重新复习一下