typedef using 定义别名与复杂类型的解析

类型别名

using定义别名的用法和typedef区别不大,但是using可以使用模板,比如:

1
2
template<typename T>
using ArrayPointer = T(*)[10];

解析复杂类型

C++复杂类型的解析遵循以下顺序,方括号和圆括号(即,标识符右侧的修饰符)优先于星号(即,标识符左侧的修饰符)。 方括号和圆括号具有相同的优先级并且都是从左到右关联。 在完全解释声明符之后,将应用类型说明符以作为最后一步。 通过使用圆括号,您可以重写默认关联顺序和强制实施特定解释。 但是,绝不要单独在标识符名称两边使用圆括号。 这可能会被错误解释为参数列表。

解释复杂声明符的一个简单方法是通过下列 4 个步骤“从里到外”地读取它们:

  1. 从标识符开始并直接查找方括号或圆括号(如果有)的右侧。
  2. 解释这些方括号或圆括号,然后查找星号的左侧。
  3. 如果在任何阶段遇到一个右圆括号,请返回并将规则 1 和 2 应用于圆括号内的所有内容。
  4. 应用类型说明符。
1
2
3
char *( *(*var)() )[10];
^ ^ ^ ^ ^ ^ ^
7 6 4 2 1 3 5

在此示例中,步骤是按顺序编号的,并且可以按如下方式解释:

  1. 标识符 var 声明为
  2. 指向以下内容的指针
  3. 返回以下内容的函数
  4. 指向以下内容的指针
  5. 包含 10 个元素的数组,这些元素分别为
  6. 指向以下内容的指针
  7. char 值。

参考资料

C# 特性(Attribute)

特性分为预定义特性和自定义特性,用于在运行时传递各种元素的行为信息的声明性标签。

1
2
[attribute(positional_parameters, name_parameter = value, ...)]
element
阅读更多

C# 属性(Property)

C#在字段的基础上延伸出了属性的概念。属性定义包含getset两个成员用于检索该属性的值以及对其赋值。可以在属性声明的大括号之后通过等号对其进行初始化,适用于不想将属性赋值为系统默认值时的情况。

阅读更多

Lua 快速入门

Lua 数据类型

Lua是动态类型的语言,不需要给变量声明类型。Lua有8个基本类型:

阅读更多

C# 关键字

修饰符

访问修饰符

访问修饰符共有四个

  • public
  • protected
  • internal
  • private
阅读更多

C# 类型

值类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;

public struct MutablePoint
{
public int X;
public int Y;

public MutablePoint(int x, int y) => (X, Y) = (x, y);

public override string ToString() => $"({X}, {Y})";
}

public class Program
{
public static void Main()
{
var p1 = new MutablePoint(1, 2);
var p2 = p1;
p2.Y = 200;
Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified: {p1}");
Console.WriteLine($"{nameof(p2)}: {p2}");

MutateAndDisplay(p2);
Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");
}

private static void MutateAndDisplay(MutablePoint p)
{
p.X = 100;
Console.WriteLine($"Point mutated in a method: {p}");
}
}
// Expected output:
// p1 after p2 is modified: (1, 2)
// p2: (1, 200)
// Point mutated in a method: (100, 200)
// p2 after passing to a method: (1, 200)

如上述代码所示,对值类型的修改只会作用到变量本身,对给他赋值的右值变量没有影响。

阅读更多

探究C++迭代器失效问题

起因

在LeetCode上做题的时候遇到一道需要手动实现deque的题目,因为需要通过一个哈希表经过O(1)的时间来访问到deque中的每个节点。于是机智的我想到了通过iterator来访问节点的方法,但是出乎意料的是出现了内存访问问题。最后定位到问题出在通过哈希表中储存的iterator来访问内存中的内容时,指针已经失效了。

阅读更多