default 关键字有两类用法

私下认可值表明式生成类型的暗中同意值。 暗许值表明式在泛型类和泛型方法中相当有效。 使用泛型类和泛型方法时出现的二个难题是,怎么样在不能够提前知道以下内容的情形下将默许值赋值给参数化类型 T

从 C# 七.一 开头,当编写翻译器能够想见表明式的体系时,文本 default
可用于暗中同意值表明式。 文本 default 生成与等效项 default(T)(其中,T
是猜测的档次)相同的值。
那可减弱数13回宣称类型的冗余,从而使代码越发简明。 文本 default
可用于以下任一地点:

负数补码 = 反码 + 一
正数补码 = 原码

  1. switch语句中钦赐默许标签
  2. 暗中认可值表明式
  • T 是援引类型或然值类型。
  • 如果 T 是值类型,它是数值依旧用户定义的布局。
  • 变量初步值设定项
  • 变量赋值
  • 扬言可选参数的暗中认可值
  • defualt关键字暗许值用法,学堂在线00740043X_20一伍_T二。为情势调用参数提供值
  • 归来语句(或 expression bodied 成员中的表明式)

着力数据类型:
(整数;实数;字符;布尔)类型
(signed/unsigned) signed char
<= (unsigned) short int
<= (unsigned) int
<= (unsigned) long int
<= long long int

switch 语句

      int caseSwitch = 1;

      switch (caseSwitch)
      {
          case 1:
              Console.WriteLine("Case 1");
              break;
          case 2:
              Console.WriteLine("Case 2");
              break;
          default:
              Console.WriteLine("Default case");
              break;
      }

已知参数化类型 T 的变量 t,仅当 T 为引用类型时,语句 t = null 才有效。 赋值 t = 0 仅对数值类型有效,对结构无效。 消除方案是使用暗许值表达式,该表明式对引用类型(类类型和接口类型)再次来到 null,对数值类型再次来到零。 对于用户定义的组织,再次回到起先化为零位情势的布局,该组织根据成员是值仍然援引类型,为种种成员变动
0 或 null。 对于可为 NULL
的值类型,default 再次回到像任何组织同样初阶化的System.Nullable<T>。

以下示例体现了文本 default 在暗中认可值表明式中的多样用法:

平头常量:

暗中认可值表明式

default对应各系列型生成默许值列表如下:
|类型|默认值|
|-|-|
|任何引用类型|null|
|数值类型|零|
|bool|false|
|enum|表达式 (E)0 生成的值,在那之中 E 是枚举标识符。|
|struct|通过如下设置生成的值:将具有值类型的字段设置为其默许值,将具有引用类型的字段设置为null。|
|可以为 null 的类型|HasValue 属性为 false 且 Value 属性未定义的实例。|

位列一下上述列表中的常见类型对应的值

在C# 7.1 之前

default(string) // null
default(int) // 0
default(int?) // null
default(dynamic) // null
default(DateTime) // 0001/01/01 0:00:00
default(DateTime?) // null

default(T) 表明式不限于泛型类和泛型方法。 默许值表明式可用于其余托管类型

public class Point
{
    public double X { get; }
    public double Y { get; }

    public Point(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class LabeledPoint
{
    public double X { get; private set; }
    public double Y { get; private set; }
    public string Label { get; set; }

    // Providing the value for a default argument:
    public LabeledPoint(double x, double y, string label = default)
    {
        X = x;
        Y = y;
        this.Label = label;
    }

    public static LabeledPoint MovePoint(LabeledPoint source, 
        double xDistance, double yDistance)
    {
        // return a default value:
        if (source == null)
            return default;

        return new LabeledPoint(source.X + xDistance, source.Y + yDistance, 
        source.Label);
    }

    public static LabeledPoint FindClosestLocation(IEnumerable<LabeledPoint> sequence, 
        Point location)
    {
        // initialize variable:
        LabeledPoint rVal = default;
        double distance = double.MaxValue;

        foreach (var pt in sequence)
        {
            var thisDistance = Math.Sqrt((pt.X - location.X) * (pt.X - location.X) +
                (pt.Y - location.Y) * (pt.Y - location.Y));
            if (thisDistance < distance)
            {
                distance = thisDistance;
                rVal = pt;
            }
        }

        return rVal;
    }

    public static LabeledPoint ClosestToOrigin(IEnumerable<LabeledPoint> sequence)
        // Pass default value of an argument.
        => FindClosestLocation(sequence, default);
}
  • 十进制
  • 八进制
  • 十六进制
    后缀:L / LL / U
    浮点常量私下认可为double型,假如后缀F(或f)能够使其变成float

私下认可文本和品种推理

C# 七.一 default的运用大规模举例
Visual Studio 2017 默认C#言语版本是七.0,需求自个儿安装7.壹
Alt+Enter快捷键打开项目性质,只怕右键点击项目,选拔属性,之后选用生成,点击高级,如下图
金沙注册送58 1

开辟高级生成设置,选择语言版本,选C# 7.壹 及以上的版本,如下图
金沙注册送58 2

假定未有C# 柒.壹 及以上的本子可选,请下载.NET Framework
四.七.二,今后风靡版本的是肆.七.二,直接下载最新版本的,省事。然后重启VS,就能收看7.1及以上的可选项。

如上内容出自MSDN。

 

初始化:

变量开首值设定项

7.1之前:

            var dstring = default(string);
            var dint = default(int);
            var dintNull = default(int?);
            var d = default(dynamic);
            var dt = default(DateTime);
            var dt1 = default(DateTime?);

7.1:

            string s = default;
            int i = default;
            DateTime? dt = default;
            dynamic d = default;

演示代码:

int a = 0
int a(0)
int a = {0}
int a{0}

变量赋值

7.1之前:

            var s = "字符串";
            s = default(string);            

7.1:

           var s = "字符串";
            s = default;

 

中间使用大括号的伊始化方式叫做列表起头化,列表早先化时不容许新闻的丢失。例如利用double值起首化int变量,就会促成数据的不见。

注解可选参数的默许值

7.1之前:

        void Test(int a, string b = null)
        {

        }           

7.1:

        void Test(int a, string b = default)
        {

        }

int iValue = default(int);
float fValue = default(float);
decimal dValue = default(decimal);
Console.Write(“值类型测试:”);
Console.WriteLine(“{0},{1},{2}”, iValue, fValue, dValue);

逗号运算符:
表达式1,表达式2
求解顺序及结果:
先求解热明式1,再求演讲明式二
最终结果为表明式贰的值
例:
a = 3 * 5, a * 四最后结果为60

为格局调用参数提供值

7.1之前:

        static void Test(int a, string b)
        {

        } 
        static void Main(string[] args)
        { 
            Test(0, null);
        } 

7.1:

        static void Test(int a, string b)
        {

        }
        static void Main(string[] args)
        { 
            Test(default, default);
        } 

string strValue = default(string);
DateTime? dt = default(DateTime?);
User user = default(User);
Console.Write(“引用类型测试:”);
Console.WriteLine(“{0},{1},{2}”, (null == strValue), (null == user),
(null == dt));
Console.WriteLine();

基准运算:
表达式1?表达式2:表达式3
规范表明式的最后类型为二和三中较高的种类

归来语句

7.1之前:

        static string Test()
        {
            return null;
        }

7.1:

        static string Test()
        {
            return default;
        }

 

sizeof运算符:
sizeof(类型名) 或 sizeof 表达式

expression bodied 成员中的表达式

7.1之前:

public string A => null;

7.1:

public string A => default;

参考:默许值表明式(C#
编制程序指南)

运作结果:
金沙注册送58 3

位运算符:

  • 按位与(&):唯有当对应位都为一,则新值中相应位为壹,不然为0
  • 按位或(|):要是对应位至少有四个为一,则新值中相应位为1,不然为0
  • 按位异或(^):
    若对应位相同,则结果该位为0;若对应位分裂,则结果该位为一
  • 按位取反(~):单目运算符,对三个2进制位按位取反

位运算:

  • 左移运算(<<)
    左移后,低位补0,高位甩掉
  • 右移运算(>>)
    右移后:
    低位:舍弃
    高位

    • 无符号数:补0
    • 有记号数:补“符号位”

涵盖转换就时把低档次数据转换为高类型数据

显式转换:
项目表明符(表明式)
(类型表达符)表明式
类型转换操作符<类型表达符>(表达式)
类型转换操作符:const_cast、dynamic_cast、reinterpret_cast、static_cast
例:int(z),(int)z,static_cast<int>(z)三种截然等价

其余控制语句

  • break语句:
    使程序从循环体和switch语句内跳出,继续执行逻辑上的吓一条语句。不宜用在别处。
  • continue语句:
    终结此次巡回,接着判断是还是不是实施下一回巡回
  • goto语句:
    使程序的实行流程跳转到居于标号所钦定的言辞。不提倡使用。

品体系称:为已有档次此外命名

  • typedef 已有品种名 新品类名表

typedef double Area,Volume;
typedef int Natural;
Natural i1,i2;
Area a;
Volume v;
  • using 新品类名 = 已有品种名

using Area = double
using Volume = double

不限定功用域枚举类型表明:

  • 枚举成分使常量,不能对它们赋值
    enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}
    无法写赋值表明式:SUN = 0
  • 枚举成分具有暗中认可值,它们依次为:0,1,贰,……
  • 也足以在宣称时再次钦定枚举成分的值
    如:enum Weekday{SUN=7,MON=1,TUE,WED,THYU,FRI,SAT}
  • 枚举值能够举办关联运算
  • 整数值无法间接赋给枚举变量
    如必要将整数赋值给枚举变量,应开始展览强制类型转换
  • 枚举值能够赋给整型变量

auto类型与decltype类型

  • auto:编写翻译器通过发轫值自动测算变量的体系
    例如:auto val = val1 + val2
  • decltype:定义2个变量与某一表明式类型相同,但并不用该表明式初步化变量
    例如:decltype(i)j = 2
    意味着j以二当做初叶值,类型与i一致

struct结构的作用是把1组相互关系的数据整合在壹齐

函数定义的语法方式:
品类标识符 函数名(方式参数表)
{
语句体系
}
函数原型:体系标识符 被调用函数名(含品种表明的形参表)
递归调用:函数直接或直接调用自己
回文:各位数字左右对称的平头

rand函数:
函数原型:int rand(void);
所需头文件:<cstdlib>
效用和重返值:求出并重临三个伪随机数

srand函数:
原型:void srand(unsigned int seed)
参数:seed发生随机数的种子
所需头文件:<cstdlib>
成效:为使rand()发生壹系列伪随机数而设置早先点。使用1看成seed参数能够重新初化rand()

用递归法计算从n个人中选k个人组成一个委员会的比不上组合数
分析

  • 由n个人里选k个人的组合数=由n-一位里选k个人的组合数+由n-壹人里选k-1个人的组合数
  • 当n=k或k=0时组合数为一

将n个盘子从A针移到C针能够解释为多少个步骤:

  • 将A上的n-2个盘子移到B针上(借助C针);
  • 把A针上多余的一个盘子移到C针上;
  • 把n-二个盘走从B针移到C针上(借助A针)

函数的参数传递:

  • 在函数被调用时才分配形参的存款和储蓄单元
  • 实参能够是常量、变量或表明式
  • 实参类型必须与形参相符
  • 值传递是传递参数值,即单向传递
  • 引用传递能够达成双向传送
  • 常引用作参数能够保证实参数据的安全

引用类型:

  • 引用(&)是标识符的小名
  • 概念三个引用时,必须同时对它实行初叶化,使它指向五个已存在的指标
  • 例如:

int i,j;
int &ri = i;//定义int引用ri,并初始化为变量i的引用
j = 10;
ri = j;//相当于i = j
  • 假诺二个引用被起初化后,就不可能改为指向任何对象
  • 引用能够看做形参

内联函数:
常见的做法是简约原型,将总体定义(即函数头和享有函数代码)放在本应提供原型的地点

  • 编写翻译时在调用处用函数体进行轮换
  • 节约了参数字传送递
  • 决定转移等费用
    注意:
  • 内联函数体内不能够有循环语句和switch语句;
  • 内联函数的概念必须现身在内联函数第1回被调用以前;
  • 对内联函数无法开展足够接口注明。

私下认可参数值:

  • 能够先行安装私下认可的参数值,调用时如给出实参,则运用实参值,不然接纳预先安装的暗许参数值。
  • 例:

int add(int x = 5,int y = 6) {
     return x + y;
}
int main() {
     add(10,20);  //10+20
     add(10);     //10+6
     add();       //5+6
}

暗许参数值的证实次序:

  • 有暗许参数的形参必须列在形参列表的最右,即暗许参数值的右手无法有无私下认可值的参数;
  • 调用时实参预形参的咬合次序是从左向右。
  • 例:

int add(int x,int y = 5,int z = 6);//正确
int add(int x = 1,int y = 5,int z);//错误
int add(int x = 1,int y,int z = 6);//错误

暗中认可参数值与函数的调用地点:

  • 假若三个函数有原型证明,且原型申明在概念以前,则私下认可参数值应在函数原型注明中付出;假如唯有函数的定义,或函数定义以前,则私下认可参数值能够函数定义中付出。
  • 例:

int add(int x = 5,int y = 6);
//原型声明在前
int main(){
  add();
}
int add(int x,int y){
//此处不能再指定默认值
  return x + y;
}

int add(int x = 5, int y = 6){
//只有定义,没有原型声明
  return x + y;
}
int main(){
  add();
}

函数重载的概念:

  • C++允许效能类似的函数在平等的效率域内以同样函数名注明,从而形成重载。方便使用,便于回忆。

注意事项:

  • 重载函数的形参必须不一致:个数分裂或项目分裂。
  • 编译程序将依据实参和形参的种类及个数的特级匹配来挑选调用哪2个函数。
  • 决不将分歧成效的函数注明为重载函数,防止出现调用结果的误解 、混淆

角度值转化为弧度 :
弧度 = 角度值*PI / 180

类与对象

  • 对象: 现实中指标的一成不变,具有属性和表现
  • 1律类对象的联合天性和行事。
  • 概念对象时,通过构造函数起初化
  • 去除对象时,通过析构函数释放财富

面向对象程序设计的中坚特点:抽象、封装、继承、多态
类定义的语法格局

class 类名称
{
  public:
            公有成员(外部接口)
  private:
             私有成员
  protected:
              保护型成员
};

构造函数的遵从

  • 在目的好被创立时选择一定的值构造对象,将对象开端化为三个特定的初阶状态

金沙注册送58,构造函数的调用时机

  • 在对象成立时被自动调用

类内初步值
private:
int hour = 0,minute = 0,second = 0;

个人类型成员

  • 若果紧跟在类名称的背后评释私有成员,则重视字private能够大致

类的成员函数

  • 在类中宣示函数原型;
  • 能够在类外给出函数体完成,并在函数名前应用类名加以限制;
  • 也足以直接在类中给出函数体,形成内联成员函数;
  • 同意证明重载函数和带暗许参数值的函数

内联成员函数

  • 内联函数体中不用有千头万绪结构
    (如循环语句和switch语句)。
  • 在类中声称内联成员函数的措施:
  • 将函数体放在类的扬言中
  • 在类外完结函数的时候利用inline关键字

暗中同意构造函数

  • 调用时得以不需求实参的构造函数
  • 参数表为空的构造函数
  • 全方位参数都有默认值的构造函数
    上边五个都以暗许构造函数,如在类中并且出现,将发生编写翻译错误:

Clock();
Clock(int newH=0,int newM=0,int newS=0);

饱含生成的构造函数
假使程序中未定义构造函数,编写翻译器将自动生成叁个暗中认可构造函数

  • 参数列表为空,不为数据成员设置先导值;
  • 万壹类钦赐义了成员的发轫值,则动用内类定义的伊始值;
  • 若果未有定义类内的始发值,则以默许格局开始化;
  • 核心项指标多少暗中同意初阶化的值是不确定的。

“=defalut”

  • 借使程序中已定义构造函数,私下认可意况下编写翻译器就不再隐含生成暗许构造函数。假使那时候如故希望编写翻译器隐含生成暗中同意构造函数,能够利用“=default”。
  • 例:

class Clock{
public:
Clock() = default;//指示编译器提供默认构造函数
Clock(int newH, int newM, int newS); //构造函数
private:
int hour,minute,second;
}

数组:数组是1种多少格局,能够存款和储蓄多个同连串的值。
数组的伊始化规则:唯有定义数组时才能运用开头化,此后就无法运用了,也无法将二个数组付给另3个数组:

int cards[4] = {3, 6, 8, 10}; //okay
int hand[4]; //okay
hand[4] = {5, 6, 7, 9}; //not allowed
hand = cards; //not allowed

可是,能够用下标分别给数组中的元素赋值。

常量表明式是指值不会转移并且在编写翻译进度就能获得总结结果的表明式。显著,字面值属于常量表达式,用常量表明式开头化的const对象也是常量表达式。
二个目的(或表达式)是还是不是常量表明式由它的数据类型和伊始值共同决定
C++1壹新标准规定,允许将变量评释为constexpr类型以便由编写翻译器来证实变量的值是否是一个常量表明式。评释为constexpr的变量一定是3个常量,而且必须用常量表明式开首化

相关文章

网站地图xml地图