C/C++/C# Note

C/C++/C# Note

Falling_Sakura

三种语言的相似之处有很多,先后学了 c++ c c#,把一些之前不知道的东西记录一下,写过很多遍的就不整理了。

变量

枚举类型

c++/c#

枚举 enum 是一种用户定义的类型,它由一组命名的整数常量组成。枚举类型的主要目的是提高代码的可读性和可维护性,特别是在处理一组相关的常量时。

示例

1
2
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;

这里就定义了一个枚举类型 eDirection,和这个类型的一个变量 dir,它只可以取其中这些常量的值。

里面的值可以设定,默认是递增的。

访问即 dir.LEFT,这样可以使代码更直观

库

conio.h

c++

_kbhit()

如果有键盘输入,则返回 1.

否则返回 0.

它是非阻塞的,这点与 _getch() 不同。

_getch()

从控制台中读取单个字符,不需要回车键。

且读取的字符不会在控制台中显示。

Class

c#

静态变量

关键字 static。

每一个 class 都有它的变量、函数等。

对象是类的实例。

如果是 static 类型的变量,那么无需为这个 class 实例化(即创建一个对象)便可以修改它的值。

示例:

1
2
3
4
5
6
7
public class Myclass {
static int staticNum;
int num;
}
Myclass myclass = new Myclass();
myclass.num = 6;
Myclass.staticNum = 6;

访问修饰符

  • public

修饰类时,代表它可以被任何文件的任何代码访问。

修饰成员时,表示这个对象可以在任何位置被访问。

  • private

只能修饰成员,表示这个变量只可以在对象内部被访问。

  • internal

类或成员只能被一个程序集中的代码访问,类的默认修饰符。

  • protected

子类可以访问,而外部不可访问。

Class 与 Struct

它们的区别在何处?

class 变量储存的是地址,而 sruct 变量储存的是值。

也就是说,如果将一个 class 赋值给另一个 class,那么这两个 class 所指向的是相同的变量。

而如果把一个 struct 赋值给另一个 struct,那么这两个 struct 是两个值相同的不同的变量。

同样,当 class 作为形参传入一个函数时,它的值会受到函数内修改的影响,因为访问的都是同一个地址。

而 struct 作为值只是复制了一份传入函数,函数内修改的是复制体,并不会影响到外面的值。

对 struct 使用 ref 关键字,即取地址,即可实现和 class 一样的效果。


struct 不能继承 struct 或者 class,无法被继承,只能继承接口。

class 可以继承一个父类,也可以继承接口。

继承

public class A : B 表示类 A 继承类B,A 是子类,B 是父类,子类可以使用父类中的变量。

而如果子类中某个函数不想使用父类中的函数,可以采用 override 关键字重新定义这个函数。

1
2
3
public override void fn() {
...
}

同时需要在父类的这个函数中添加 virtual 关键字表示这个函数允许被重写。

1
2
3
protected virtual void fn() {
...
}

需要注意,父类变量可以存储子类变量的值,但子类变量不可以存储父类变量的值。

所有类型的基类是 object。

Partial

在类前加上此关键字可以在各个文件中写这个类,并且它们最终会合并在一起。

1
2
3
public partial class p {
...
}

接口

在类前加上 interface 便可以作为一个接口。

接口内定义若干方法,而不定义它们的实现,且不能添加访问修饰符,默认 public。

接口只提供声明,不提供实现。

所以继承接口后需要给出它相应的实现。

Abstract

添加 abstract 的类无法被实例化,并且可以暂时不实现接口。

abstract 也可以修饰函数,只声明不实现,留给子类实现。

抽象类中可以实现接口。

类只能继承一个抽象类。

抽象类也可以自己声明函数、属性并实现。

泛型

1
2
3
4
5
public class GV<T> {
public T x;
public T y;
}
GV<int> giv = new GV<int>();

这样就可以实现同一份代码的不同类型。

泛型方法:

1
2
3
4
public void Attack<T>(T a, T b) where T : Actor{
a.Attack();
b.Attack();
}

需要说明这个泛型继承自哪个类,否则默认就是 object。

函数

函数指针

使用 delegate 声明一个类型,它可以储存多个相同形式的函数并依次执行,通过 += 和 -= 控制里面的函数。

包括这个函数的类型,形参等。

1
2
3
4
5
6
7
8
9
10
11
12
13
delegate float CalcFn(float v1, float v2);

float Add(float a, float b) {
return a + b;
}
float Mul(float a, float b) {
return a * b;
}

CalcFn p = Add;
p(1f, 2f);
p += Mul;
p(1f, 2f);

相当于一个函数集合。

Func<T1, T2, TResult> 表示一个委托类型,前面几个是输入参数的类型,最后一个是返回值的类型。

Action<T1, T2> 是无返回值

  • Title: C/C++/C# Note
  • Author: Falling_Sakura
  • Created at : 2024-06-05 21:00:00
  • Updated at : 2024-11-21 10:44:39
  • Link: https://vercel.fallingsakura.top/edeb27c6.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments