如在成员变量或者成员方法前面,加上Private关键字,则其他类就无法调用这个类中的成员方法或则和成员变量。但是,如果这个类有成员内部类,则不受这方面的限制。...只是不能够进行直接的引用,而是要使用内部类对象引用的方法才能够调用内部类的成员变量。这一点程序开发人员需要切记。成员内部类与外部类相互访问彼此的成员方法限制是不同的。...由于在内部类中可以随意访问外部类中成员方法与成员变量。但是此时成员内部类与外部类的变量名相同,那么如果要在内部类使用这个变量i,编译器怎么知道现在需要调用外部类的变量i,还是内部类的变量i呢? ...此时如果在成员内部类中调用这个变量,该如何进行区分呢?通常情况下,如果使用this.i 的方式来调用变量,则表示这个变量是成员内部类中定义的变量。...从以上的总结中可以看出,成员内部类与外部类之间的关系确实很复杂。作为一个Java程序开发人员,必须要了解内部类与外部类成员相互之间引用的准则、内部类对象与外部类对象的关系。
先声明,后使用 1.3 变量都有其对应的作用域 2.不同点: 2.1 在类中声明的位置的不同 属性:直接定义在类的一对{}内 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量...特别地:形参在调用时,我们赋值即可 2.4 在内存中加载的位置: 属性:加载到堆空间中 (非static) 局部变量:加载到栈空间 2.方法 方法 = 成员方法 = 函数 = method...对对象的属性等进行初始化 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的 5.内部类 在Java中,可以将一个类定义在另一个类里面或者一个方法里边...言外之意,不使用final,就可以被继承 可以被abstract修饰,可以被static修饰 2.局部内部类 (1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内...普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。
注意,外部类访问内部类的的成员有些特别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方法默认为静态的了。...内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。...3、另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。...同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。 四、方法内部类 顾名思义,把类放在方法内。...但是该方法结束之后, 在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。
0; } 输出结果如下: 得益于 static 修饰的成员变量统计 注意: 静态成员函数 不可以调用 非静态成员变量,没有 this 指针 非静态成员函数 可以调用 静态成员变量,具有全局属性..._val << endl; } int main() { Test t; Print(t); } 程序正常编译,结果如下: 友元函数可以用来解决外部运算符重载函数无法访问类中成员的问题,但还是不推荐这种方法...: int _a; } 内部类天生就是外类的友元类 也就是说,B 天生就能访问 A 中的成员 ️特性 内部类在C++中比较少用,属于了解型知识 内部类的最大特性就是使得内部类能受到外类的访问限定符限制...内部类特点: 独立存在 天生就是外类的友元 用途: 可以利用内部类,将类隐藏,现实中比较少见 注意: 内部类跟其外类是独立存在的,计算外类大小时,是不包括内部类大小的 内部类受访问限定符的限定,假设为私有...,内部类无法被直接使用 内部类天生就算外类的友元,即可以访问外类中的成员,而外类无法访问内部类 ---- 编译器优化 前面说过,编译器存在优化行为,这里就来深入探讨一下 把上面的代码搬下来用一下,方便观察发生了什么事情
一、构造函数再叙 1、构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个初始值 class Date { public: Date(int year, int month,...,而构造函数体内是可以多次赋值的,所以上述构造函数调用后不能称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值 2、初始化列表 以一个冒号开始,接着以一个逗号分隔的数据成员列表,每个成员变量后边跟一个放在括号中的初始值或表达式...,标头先进入Time后先走初始化列表再走花括号内的内容,初始化列表只走一次 ⑤成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序 class A { public: A(int a) :_a1...静态成员变量一定要在类外进行初始化 2、特性 (1)静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 (2)静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明...,内部类就是外部类的友元类,外部类无法访问到内部类的private成员 内部类定义在外部类的public、protected、private都行 内部类可以直接的访问外部类的static成员 sizeof
再谈构造函数 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 class Date { public: Date(int year, int month,...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...静态成员变量一定要在类外进行初始化 面试题:实现一个类,计算程序中创建出了多少个类对象。...静态成员函数在没有实例化对象的情况下就可以被调用,它没有 this 指针,因此无法访问非静态成员函数或非静态成员变量。只有通过类的对象实例才能访问非静态成员函数。
,还有骨子里的自信与淡定✨ 一、构造函数的深入理解 1.1 初始化列表 前面,我们已经学习过构造函数,在创建对象的时候,编译器会自动调用构造函数,用于给初始化对对象的成员变量赋予初始值.那构造函数体内的语句时初始化吗...在构造函数的函数名参数后与{}中间的区域是成员变量初始化的地方. 初始化列表: 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...对于下列成员变量,只能使用初始化列表进行初始化,因为这些成员变量只能在定义时就给出初始化的值: const成员变量 引用成员变量 没有默认构造函数的自定义类型成员 正确写法: class Date {...在声明静态成员变量时,需要在类的定义中进行,但不能在函数内部进行。在类的定义中声明的静态成员变量不会占用内存空间,只有在类外定义时才会真正地分配内存。...如果在类的定义中进行初始化,那么每个包含该类定义的文件都会进行初始化,这违背了静态成员变量只应初始化一次的原则。将初始化操作移到类外,可以确保只有一次初始化。
简单来说,就是在一个类的构造器创建了一个内部类(内部类本身是拥有对外部类的所有成员的访问权的),此时外部类的成员变量还没初始化完成。...但是,同时这个内部类被其他线程获取到,并且调用了内部类可以访问到外部类还没来得及初始化的成员变量的方法。...} } } 只要线程得到持有内部类引用的数组,就可以使用内部类获取外部类的有可能未初始化的成员变量。...也就是说,如果要在构造函数中创建内部类,那么就不能在构造函数中把他发布了,应该在构造函数外发布,即等构造函数执行完初始化工作,再发布内部类。...从根开始递归下去,因为多态性此时调用子类覆盖后的draw()方法(要在调用RoundGlyph构造函数之前调用),由于步骤1的缘故,我们此时会发现radius的值为0; (3)按声明顺序调用成员的初始化方法
当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。 局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。...在构造器中可以使用 this(params) 来调用本类的其它构造器,使用 super(params) 来调用父类构造器,只能书写在本构造器第一行,所以它们不能同时出现。...使用 super 调用父类中的实例方法,使用父类类名调用父类中的类方法。 如果父类方法具有 private 访问权限,则该方法对其子类是隐藏的,因此其子类无法访问和重写该方法。...从内部类里引用外部类的属性或者方法时,可以用命 OuterClass.this.。 非静态内部类里不能有静态成员。 内部类可以使用 static 修饰,外部类不行。...从外部类外创建内部非静态类的语法:OuterClass.InnerClass varName = OuterInstance.new InnerConstructor(); 从外部类外创建内部静态类的语法
在构造器中可以使用 this(params) 来调用本类的其它构造器,使用 super(params) 来调用父类构造器,只能书写在本构造器第一行,所以它们不能同时出现。...使用 super 调用父类中的实例方法,使用父类类名调用父类中的类方法。 如果父类方法具有 private 访问权限,则该方法对其子类是隐藏的,因此其子类无法访问和重写该方法。...从内部类里引用外部类的属性或者方法时,可以用命 OuterClass.this.。 非静态内部类里不能有静态成员。 内部类可以使用 static 修饰,外部类不行。...从外部类外创建内部非静态类的语法:OuterClass.InnerClass varName = OuterInstance.new InnerConstructor(); 从外部类外创建内部静态类的语法...纠误一处:《疯狂 Java 讲义》P214 讲道「如果匿名内部类需要访问外部类的局部变量,则必须使用 final 修饰符来修饰外部类的局部变量,否则系统将报错。
其实,构造函数内对成员变量赋值的操作并不能称之为对成员变量的初始化,而是只能称之为对成员变量赋初值。...,如果一个成员变量被我们显式的在初始化列表中写了,那么编译器就不在初始化列表中生成该成员变量的默认初始化了; 每一个类对象的成员变量的定义都发生在构造函数的初始化列表中; 在调用构造函数时,先进行初始化列表中的操作...细化类成员变量的 定义初始化: 类成员变量的 定义初始化 发生在初始化列表阶段 即类成员变量在初始化列表进行 定义初始化 而在构造函数内进行的是类成员变量的赋值和其他必要的操作,故在构造函数内进行的不能称之为...,它不属于外部类,不能通过外部类的对象去访问内部类的成员 ---- 内部类天生是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,反之则不成立; 内部类定义在外部类的public...、protected、private时,对内部类的使用会受到访问限定符的影响,这一点与内部类外部类的其他成员相同; public修饰时在类外指定外部类类域即可使用内部类成员; private修饰时则在类外不能使用内部类任何成员
再谈构造函数 函数体内赋值 在构造函数体内进行赋值,即对象的成员变量先通过默认构造函数创建,随后在构造函数体内被赋值。...初始化列表 初始化列表是在构造函数的声明后,紧跟着冒号 : 的一部分。它在对象创建时,直接调用成员变量的构造函数或对其进行初始化。...(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) class A{ public...即使obj1和obj2是不同的实例,但它们都共享同一个staticVar变量。当obj1修改了staticVar的值,obj2也会看到同样的变化。 【注意】 静态成员变量的初始化必须在类定义外进行。...Private(私有):外部无法访问,只有类的内部成员函数可以访问。 Protected(保护):子类可以访问,但外部类无法访问。
因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化列表 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量...静态成员变量一定要在类外进行初始化 1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 3....静态成员函数属于类本身,而非类的某个特定对象。非静态成员函数则依赖于类的特定实例,由于静态成员函数没有this指针,因此它无法访问类的非静态成员,因为这些非静态成员需要this指针来访问。 2....内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。 外部类对内部类没有任何优越的访问权限。
前言 本文继续介绍与C++中与面向对象相关的内容,介绍了构造函数中的初始化列表、隐式类型转换、类的静态成员、友元、内部类、匿名对象以及编译器对拷贝构造的优化等概念。...---- 一、再谈构造函数 1.构造函数体赋值 在创建对象时,编译器通过调用构造函数给该对象中各个成员变量一个合适的初值。...静态成员变量一定在类外进行初始化,静态成员函数中没有this指针。 2.特性 静态类成员为所有类对象所共享,不在某个具体的类对象中,而是存放在静态区。...,但不是类的成员函数 友元函数不能用const修饰 因为友元函数没有this指针,它是一个的类外的函数,不过可以访问类内的成员。...总结 以上就是今天要讲的内容,本文介绍了构造函数中的初始化列表、隐式类型转换、类的静态成员、友元、内部类、匿名对象以及编译器对拷贝构造的优化等相关概念。
初始化列表: 在中篇中我们提到了构造函数的功能是初始化变量,接下来讲到的初始化列表也有同样的功能。...用法: 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式 既然它的功能和构造函数一样,那为什么要有初始化列表呢?...当然是为做到构造函数做不到的事情,比如: 我们有一个const的变量,那么就代表它在被定义的时候就必须被初始化,如果我们用构造函数,就会报错,如下: 而初始化列表就可以很好地解决这个问题: 如果成员变量有引用...,也是只要定义就必须初始化的时候,也只能用初始化列表完成; 必须用初始化列表的三种情况: 1.const成员变量 2.引用 3.自定义变量(没有默认的构造函数) 注意初始化列表的初始化顺序是按声明的顺序从上到下...友元函数: 如下图,我们在类外定义的函数,无法访问类里面私有的成员变量: 但是我们就想让这个函数访问到,又不想让私有成员变成公有,可以采用友元声明: 友元类: 跟刚才友元函数差不多,在A类对B类声明友元
类体中内容被称为类的成员:类中的变量为类的属性或者成员变量;类内的函数时类的方法和成员函数。...构造函数下可以用初始化列表进行构造,初始化列表的格式就是以:开始 ,分割 然后成员变量后面跟括号表示赋给的值 :A(a),B(b) 每个成员变量只能在初始化列表内出现一次,可以认为是每个成员变量自定义初始化的地方...0; } static成员(静态成员) 用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在此类外进行初始化 静态成员变量为所有类对象所共享..._A = 0;//友元函数访问 } 内部类 一个类被定义在另一个类内部,就是内部类,是一个独立的类,和定义在全局相比,只是收到了外部类类域的限制,外部类定义的对象中不包含内部类。...内部类默认是外部类的友元类 内部类是一种封装,如果把内部类放到私有或者保护的位置,那么内部类就是外部类的专有类了 class A { friend void B(A& a);//友元函数
const对象不可以调用非const成员函数 -> 权限放大 非const对象可以调用const成员函数 -> 权限缩小 const成员函数内不可以调用其它的非const成员函数 -> this指针被const...修饰,权限放大 非const成员函数内可以调用其它的const成员函数 -> 权限缩小 1.1 取地址及const取地址操作符重载 这两个默认成员函数一般不用重新定义 ,编译器默认会生成。...二、再谈构造函数 2.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...于是找到了对象实例化必须调用的构造函数,但如果在构造函数体中的话,可能出现多次初始化的情况。 最后规定了初始化列表这一概念!其是每个成员变量定义初始化的位置!
对于一个普通成员函数,const对象是无法调用的,因为const对象的成员变量不允许被修改;而当成员函数被const修饰时,就确保了函数内部不会修改成员变量的值,const对象就可以调用该函数。...之前我们在实现构造函数时,都是在函数体内部对成员变量赋初值,实际上,对成员变量进行初始化的方式还有一种:初始化列表。它位于构造函数的参数列表之后,函数体大括号之前。...当然,对于普通成员,我们也可以在声明时赋缺省值,但是相比显示写在初始化列表当中,会有一些效率的损耗。 注:对类类型的成员变量通过初始化列表进行初始化时,本质也是在调用它的构造函数。...静态成员变量要在类中进行声明,并且初始化必须要在类外,而不是类中(因为在类中给的初值是给初始化列表的,而静态成员变量不走初始化列表)。...由于静态成员函数不存在this指针,所以它也就无法访问到普通成员变量,只能访问静态成员变量。当然,如果一个成员函数是非静态的,它也可以访问静态成员变量。
1.再谈构造函数 1.1 构造函数体赋值 构造函数是用来初始化对象的特殊函数。当我们创建一个对象时,编译器会自动调用构造函数来给对象的成员变量赋值。...简单理解:当你买一个新手机,打开包装,这就像调用了构造函数。手机里的默认应用程序就像成员变量的初始值。这些默认应用虽然是预装的,但我们可以再安装新的应用,这相当于构造函数体内的赋值操作。...但是这个过程叫赋值,不叫初始化,因为我们可以在构造函数内多次赋值。 总结:构造函数体内的赋值可以多次进行,而初始化只能进行一次。...}; 在上面的代码中,: x(a), y(b) 就是初始化列表,它在构造函数体执行之前完成成员变量的初始化。...初始化:静态成员变量必须在类外进行初始化。 面试题:实现一个类,计算程序中创建了多少个类对象。
类与对象下篇:: 1.再谈构造函数 构造函数体赋值: 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初始值,而不能称作初始化,因为初始化只能初始一次,而构造函数体内可以多次赋值。...(初始化只能初始化一次) 2.类中包含一次啊成员必须放在初始化列表中进行初始化: a.引用成员变量 b.const成员变量 c.自定义类型成员(该类没有构造函数...2.内部类虽然定义在类的里面,但完全是两个独立的类,和定义在类外面没有区别,真正的影响点是B类的访问受A的类域和访问限定符的限制,内部类受访问限定符的限制,如果一个内部类被设置成私有,那么main函数无法访问...n次构造函数 return Sum::GetRet(); } }; //方法二:内部类 //利用内部类的两个性质: //1.内部类可以直接访问外部类的静态成员 //2.内部类是外部类的友元 class
领取专属 10元无门槛券
手把手带您无忧上云