构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化 (1)构造函数的名字必须与类同名; (2)构造函数没有返回类型,它可以带参数,也可以不带参数; (3)构造函数的主要作用是完成对类的初始化工作...; (4)在创建一个类的新对象(使用new关键字)时,系统会自动调用给类的构造函数初始化新对象; C#的类有两种构造函数:实例构造函数和静态构造函数 实例构造函数:负责初始化类中的实例变量,...它只有在用户用new关键字为对象分配内存时才被调用,而且作为引用类型的类,其实例化后的对象必然时分配在托管堆(Managed Heap)上。...如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行.任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项; ...(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数; 一个类可以同时拥有实例构造函数和静态构造函数,这是惟一可以具有相同参数列表的同名方法共存的情况
前言 本节主要来学习下实例构造函数、私有构造函数和静态构造函数。 构造函数的作用: 1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。 ...实例构造函数 使用 new 表达式创建某个类的对象时,会使用实例构造函数创建和初始化所有实例成员变量。 要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。...类构造函数可通过初始值设定项来调用基类的构造函数,如下所示: abstract class Shape { public const double pi = Math.PI; protected...在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 无法直接调用静态构造函数。 在程序中,用户无法控制何时执行静态构造函数。...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
C++11中,支持了多参数的构造函数隐式类型转换: 那么有没有什么办法让这个隐式类型转换不发生呢?很简单,在构造函数前,加上关键字explicit即可: 可以看到加上后再使用隐式类型转换会直接报错。...static成员: 当我们想定义一个全局变量,又想用类来封装时,不妨试试我们类里的static成员变量: 它不属于某一个对象,而是属于所有对象,属于整个类。...友元函数: 如下图,我们在类外定义的函数,无法访问类里面私有的成员变量: 但是我们就想让这个函数访问到,又不想让私有成员变成公有,可以采用友元声明: 友元类: 跟刚才友元函数差不多,在A类对B类声明友元...,那么在B类中就可以直接访问A类成员,比如: 不建议经常使用友元,友元虽然便利,但是打破了封装 内部类: 概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。...匿名对象: c语言中有匿名结构体,c++也有匿名对象: 匿名对象的生命周期只在当前一行,有时候只需要调用类里面的一个函数时,可以用匿名对象。 c++类和对象到此结束。
1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...答案就是——初始化列表 1.2 初始化列表 首先,初始化列表是我们的祖师爷本贾尼博士为了解决在某些成员变量在定义时必须初始化的况。...这个初始化列表其实发生在构造函数之前,也就是实例化整个对象时先对所有的成员都进行了初始化 使用方法:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式...但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator>同理。...但是在类外定义的话没办法直接用类里面的私有成员,如果强行变成公有就破坏了封装性,所以这里会用到友元的知识,友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明
再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。...成员变量 在类中 声明次序 就是其在初始化列表中的 初始化顺序 ,与其在初始化列表中的先后次序无关 1.3 explicit关键字 构造函数不仅可以构造与初始化对象, 对于接收单个参数的构造函数,...私有 成员,它是 定义在类外部 的 普通函数 ,不属于任何类,但需要在类的内部声明,声明时需要加friend 关键字。...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
此功能实现用于创建不可变类型的真正语言支持且使用更简洁和方便的自动属性语法。 02 自动属性初始化表达式 自动属性初始值设定项可让你在属性声明中声明自动属性的初始值。...每当需要变量、属性或成员字段的名称时,这是让工具正常运行的好办法。...10 使用索引器初始化关联集合 索引初始值设定项是提高集合初始值设定项与索引用途一致性的两个功能之一。...在早期版本的 C# 中,可以将集合初始值设定项用于序列样式集合,包括在键值对周围添加括号而得到 Dictionary: private Dictionary<int, string...11 集合初始值设定项中的扩展 Add 方法 使集合初始化更容易的另一个功能是对 Add 方法使用扩展方法。 添加此功能的目的是进行 Visual Basic 的奇偶校验。
类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量...静态成员变量一定要在类外进行初始化 1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 3....:_scount = 0; // 在类定义外部初始化静态成员_scount,初始值为0 void TestA() { cout << A::GetACount() << endl;...友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
使用 C# 可以在单条语句中实例化对象或集合并执行成员分配。 对象初始值设定项 使用对象初始值设定项,你可以在创建对象时向对象的任何可访问字段或属性分配值,而无需调用后跟赋值语句行的构造函数。...查询表达式常使用只能通过使用对象初始值设定项进行初始化的匿名类型,如下面的声明所示。...Add 时,集合初始值设定项允许指定一个或多个元素初始值设定项。...digits2 = new List { 0 + 1, 12 % 3, MakeInt() }; 下面的集合初始值设定项使用对象初始值设定项来初始化上一个示例中定义的 Cat 类的对象。...请注意,各个对象初始值设定项分别括在大括号中且用逗号隔开。
1 -> 再谈构造函数 1.1 -> 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...(初始化只能初始化一次); 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量; const成员变量; 自定义类型成员(且该类没有默认构造函数时)。...2.2 -> 特性 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区; 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明; 类静态成员即可用 类名::静态成员 或者...友元关系是单向的,不具有交换性; 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行...拷贝对象时的一些编译器优化 在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。
二、再谈构造函数 2.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...能用初始化列表就建议使用初始化列表 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化(即使初始化列表未给值,被初始化为随机值)。...我们前面讲的在声明时给缺省值,其实那个缺省值就是给初始化列表用的! 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。...因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。 this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
可通过使用 new 运算符和对象初始值创建匿名类型。 有关对象初始值设定项的详细信息,请参阅对象和集合初始值设定项。...Console.WriteLine(v.Amount + v.Message); 在VS中编写代码时既可以看出匿名类中的属性类型: ?...包含其他种类的类成员(如方法或事件)为无效。 用来初始化属性的表达式不能为 null、匿名函数或指针类型。 最常见的方案是用其他类型的属性初始化匿名类型。...声明初始化了一个只使用 Product 的两个属性的新类型。 这将导致在查询中返回较少数量的数据。...如果你没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。 必须为使用表达式初始化的属性提供名称,如下面的示例所示。
1.再谈构造函数 1.1构造函数体赋值 根据之前介绍的内容:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,我们之前使用的构造函数都叫做函数体内赋初值 class Date...因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化与赋值区别: 初始化是在创建变量时为其赋予一个初始值。在构造函数中,初始化通常是在对象创建时对成员变量进行赋值。...赋值操作符=用于将一个值赋给一个已经存在的变量 初始化是在变量创建时进行的,而赋值是在变量已经存在的情况下进行的 初始化可以只进行一次,而赋值可以进行多次 在一些情况下,初始化可能比赋值更加高效,因为它可以在对象创建时直接将初始值传递给对象...) 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量在类中声明次序就是其在初始化列表中的初始化顺序...因此,静态成员函数可以直接访问静态成员变量,因为它们不依赖于特定的对象实例,而是与整个类相关联的 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 类静态成员即可用 类名::静态成员
公有属性 一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况...在类定义的时候非静态数据成员是不分配内存的,只有在创建类对象的时候才分配内存,但静态数据成员是要分配内存的,因为它是属于类的,只有一块内存,所以要初始化它,而且不能在类的声明中初始化,必须要在类外初始化...静态数据成员的访问受类的访问权限控制。如果定义为私有,则可以在类内访问到。...首先,可能你在做题的时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在类创建的时候就存在了,在没有创建类对象的时候就已经存在静态成员函数,而普通函数必须在类对象被创建的时候才能被使用...简而言之,静态成员函数是服务于类的,而不是某个类对象,它的方便在于不需要定义类对象就能使用。
那我们先来回忆一下构造函数: 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。...这里就可以这样: 那如果我们这里不想让它支持类型转换了,有没有什么办法呢?...2.1 静态成员函数 那有没有什么办法可以不通过对象就能调用到Getn函数呢? 那我们就可以把Getn函数搞成静态成员函数,也是在前面加一个static关键字就行了。...但又会导致类外没办法访问成员,然后我们就使用友元解决了。operator>>同理。...Time类中的成员变量都是私有的,那在Date类中我们想访问Time类成员的私有成员变量,是不行的。
类与对象下篇:: 1.再谈构造函数 构造函数体赋值: 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,但是不能将其称为对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初始值,而不能称作初始化,因为初始化只能初始一次,而构造函数体内可以多次赋值。...,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。...,并且类的每个对象共享,生命周期是全局的,作用域受类域限制,只能在类域中使用 在main函数中使用需要加访问限定符A::N或者a.N(但静态变量N不在a里面)(前提在类中静态成员变量设置成公有的) 静态成员函数没有...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
五、内部类 六、再次理解封装 七、再次理解面向对象 零、前言 本章为C++类和对象的最后一章,将类和对象的知识进一步学习和掌握 一、再谈构造函数 1、构造函数体赋值 在创建对象时,编译器通过调用构造函数...示图: 总结: 函数体赋值相当于是在对象成员变量创建之后再给成员变量赋值 2、初始化列表 概念: 初始化较函数体赋值是更正规的初始化成员变量,当对象创建时,便是成员变量定义的时候,有些成员变量必须在定义的时候进行初始化...,而这就是初始化列表的价值 使用: 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式 示例: class Date { public:...1、友元函数 有关问题引入:关于重载输入输出操作函数 当重载输出函数时,如果将函数设为类成员变量,我们发现cout\cin的输出\输入流对象和隐含的this指针在抢占第一个参数的位置。...注意: 友元关系是单向的,不具有交换性 示例:Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行
注意: 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时)...友元函数 问题:现在尝试去重载operator>同理。...下面是使用友元的方案: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
再谈构造函数 1.1 构造函数体赋值 我们在创建一个对象时,编译器会调用该对象的构造函数对该对象的成员进行初始化。...静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区 2. 静态成员变量 必须在 类外定义 ,定义时不添加 static 关键字,类中只是声明 3....但是实际使用中 cout 需要是第一个形参对象,才能正常使用。所以要将 operator<< 重载成 全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。...私有 成员,它是 定义在类外部 的 普通函数 ,不属于任何类,但需要在 类的内部声明,声明时需要加 friend 关键字。...比如上述 Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类中直接 访问 Time 类的私有成员变量,但想在 Time 类中访问 Date 类中私有的成员变量则不行
定义成员函数 所有的成员都必须在类的内部声明,但是成员函数体可以定义在类内也可以定义在类外 this指针:成员函数会通过一个名为this的额外的隐式参数来访问调用它的那个对象,当我们调用一个成员函数时用请求该函数的对象地址初始化...ii) : i(ii), ci(ii), ri(i) { } 建议使用构造函数初始值:在很多类中初始化和赋值事关底层效率问题,前者直接初始化数据成员,后者则先初始化再赋值。...默认初始化的发生条件: 我们在块作用域中不使用任何初始值定义一个非静态变量或者数组时 当一个类本身含有类类型的成员且使用合成的默认构造函数时 当类类型的成员没有在构造函数初始值列表中显式地初始化时 值初始化的发生条件...: 在数组初始化的过程如果我们提供的初始值数量少于数组的大小时 当我们不使用初始值定义一个局部静态变量时 当我们书写形如T()的表达式显式地请求值初始化时,其中T是类型名 聚合类 聚合类使得用户可以直接访问其成员...定义静态成员 在类的外部定义静态成员时不可重复static关键字,该关键字只能出现在类内部的声明语句 静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的,这意味着它们不是由类的构造函数初始化的
_day; } 注意: 重载操作符必须有一个自定义类型参数 运算符重载定义在类外时不能访问类中的私有成员,因此重载成成员函数 作为类成员函数重载时,成员函数的第一个参数为隐藏的this 赋值运算符重载...初始化列表 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 对象中有了一个初始值,因此构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...使用初始化列表时注意: 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时...友元分为: 友元函数 友元类 友元函数 如果尝试去重载operator<<,我们发现没办法将operator<<重载成成员函数,因为函数的参数位置不一样,cout的输出流对象和隐含的this指针在抢占第一个参数的位置...,会自动调用析构函数 匿名对象的特点不用取名字 因此当我们只是想使用类中的某一个函数时,我们能创建匿名对象!
领取专属 10元无门槛券
手把手带您无忧上云