首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个好友函数不允许使用brace-init-list,而静态函数允许呢?

好友函数是指在类的外部定义的非成员函数,但可以访问类的私有成员。而brace-init-list是一种用于初始化对象的语法,使用花括号括起来的列表。

好友函数不允许使用brace-init-list的原因是,好友函数的定义不在类的作用域内,它无法直接访问类的成员变量和成员函数。因此,在好友函数中使用brace-init-list进行初始化是没有意义的,因为无法直接访问类的成员来进行初始化操作。

相反,静态函数是属于类的成员函数,可以直接访问类的静态成员变量和静态成员函数,因此可以使用brace-init-list进行初始化。静态函数在类的作用域内定义,可以直接访问类的成员,包括私有成员,因此可以使用brace-init-list来初始化对象。

总结起来,好友函数不允许使用brace-init-list是因为好友函数的定义不在类的作用域内,无法直接访问类的成员进行初始化操作;而静态函数可以直接访问类的成员,因此可以使用brace-init-list进行初始化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么不允许使用 Java 静态构造函数

不允许使用 Java 静态构造函数,但是为什么?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。...**仅允许公开,受保护和私有**。 [zhtwu6wcpq.png] 静态属于类,构造函数属于对象 我们知道静态方法,静态块或变量属于该类。...构造函数属于该对象,并在使用 new 运算符创建实例时调用。由于构造函数不是类属性,因此有理由认为它不能是静态的。 静态块 / 方法无法访问非静态变量 我们知道静态方法不能访问非静态变量。...count is class variable //and shared among all the objects of the class count=c; } } 总结 我们说明了为什么不允许使用...我们可以使用静态块以及构造函数本身来初始化静态变量。

3K70

Java动态绑定与静态绑定之胡思乱想

2.那对于虚拟机来说,怎么确定使用静态绑定还是动态绑定? ...1中提到的应该使用静态绑定的函数都是通过invokestatic和invokespecial这两个来调用的,所以,虚拟机看到这两个指令,就明白应该采用静态绑定啦,而其余的则使用动态绑定! ...3.重写和重载分别用的什么绑定?  答:显然,重写使用的是动态绑定,重载,多个函数不同之处在于参数列表,所以,在他们之间,采用静态绑定即可。 ...所以这样是不允许的! ...补充(2018.5.4):上面的回答从底层实现的角度阐释了为什么不允许通过不同的返回值类型来进行重载或重写,今天在读《Thinking in java》这本书时,看到了设计层面的回答:如果允许通过不同的返回值进行重载或重写

1K40

C++14新增特性汇总

3 constexpr放松限制 使用constexpr-描述符后,指定的变量或函数的值可以在常量表达式中使用。...(x==y)<<std::endl; return 0; } 代码输出结果为:1 5 函数返回值推导 在C++11中使用后置类型推导函数返回值,C++14起,可以省略,返回值使用auto,编译器直接将函数体中的...一旦在函数中见到一条返回语句,那么从该语句推导的返回类型就可以用于函数的剩余部分。 如果返回语句使用花括号初始化器列表(brace-init-list),那么不允许推导。...{}不允许推导 auto func () { return {1, 2, 3}; } // 错误 6 std::make_unipue方法 C++14提供了std::make_unique方法.使用方法如下...Ints > struct integer_sequence; 有一个公开静态成员函数size,返回Ints的个数。

46010

C++变量的存储说明符和cv-限定符

要注意静态变量使用范围: int global = 1000;// 在函数外声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用的还是同一个,共享了变量...),要么用static声明来隐藏这个大全局global(此时是新的变量) static int one_file = 50;// 在函数使用static声明,只在文件内各个函数使用 void func...int lama = 0;// 普通变量,只能在函数使用函数不执行就不会存在 } 函数内创建与外部静态变量同名的变量时,将使用自己创建的,但是可以用::操作符表示使用外部的: int global...person me = {"Cloudox", 24}; strcpy(me.name, "Cloud");// 这是不允许的,因为结构体person的实例me是用const修饰的 me.age++;...为什么会发生变化?因为假设你指针指向某个硬件位置,其中包含来自串行端口的时间或信息,这就有可能硬件本身改变它,不是你程序去改变它。 那为什么要告诉程序它可能变化

59110

C++ 学习笔记

声明格式为:*类型标识符 函数名(参数表) int * func_sum(int n) 3. 构造函数 使用初始化列表的好处? 1. 类成员中存在非静态常量或者引用类型,只能使用列表初始化 2....成员变量没有默认初始化函数时,比如自定义的类,同样只能使用列表初始化。 3. 提高效率。 为什么成员初始化列表效率更高? 因为对于非内置类型,少了一次调用默认构造函数的过程。...初始化列表是成员变量定义的地方,类里面只是对变量的声明。初始化列表早于为其开辟内存空间。 默认构造函数的作用 为什么建议要自定义默认构造函数?...不支持局部拷贝 例如不允许C c(b, e);//将迭代器b和e之间的元素拷贝到c。不允许用C1={a,b,c...}...;用列表中的元素替换C1 2.不允许添加或删除元素,因为array是固定大小的。 相比于数组,array可以使用成员函数

61960

3 :面向对象初级

多继承:一个子类可以有多个直接父类(java中不允许,但进行了改良)  不直接支持,因为多个父类中有相同成员,会产生调用不确定性。  在java中是通过"多实现"的方式来体现。...在子类构造对象时,发现,访问子类构造函数时,父类也运行了。  为什么? 原因是:在子类的构造函数中第一行有一个默认的隐式语句。...super(); 子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数为什么子类实例化的时候要访问父类中的构造函数? ...为什么完成这个必须的动作,就在子类的构造函数中加入了super()语句。 如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用 父类中哪个构造函数。...必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。 如何保证对象唯一性? 1,不允许其他程序用new创建该类对象。 2,在该类创建一个本类实例。

72090

半天掌握TypeScript,感觉就像写Java

为什么要学习TypeScript?因为它的语法和Java真的很像。有了这个东西,就可以摆脱恼人的JavaScript,拥抱前端的技术栈。 TypeScript是JavaScript的超集。...接下来,就可以使用node命令执行这个普通的js文件。 下面是一段简单的ts代码。是不是和Java很像?...]: any; 这一行代码值得研究,但不推荐这么做 number[] 数组和Java类似,不过这是声明后置的语法,值使用[]声明,不是{} function 函数和javascript的没什么区别,有两种声明方式...npm的,后续可以使用import导入 那什么是declare?...作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。

1.4K20

【Linux】静态库和动态库

Linux为什么不允许普通用户给目录建立硬链接? 系统层面上有.和…硬链接指向目录。...所以不允许普通用户给目录建立硬链接。...那样太过于麻烦,为了让用户更好的使用库,我们就有把所有的.o文件打成一个包,给对方提供一个库文件即可!把多个.o合并成一个文件,这个文件就是库,把包方式的不同就分为了动态库和静态库*。...---- 准备的文件: 三、制作静态库 我们如果想自己写一个库,要不要在这个库里面写main函数?答案肯定是不要的,库是被别人用的,自己写的main会和库里的main发生冲突。...静态库可能有多个程序用了C库,加载到内存时,内存里可能会存在100份重复的代码。动态链接不会出现重复的代码,减少内存。

26330

为什么 C# 的 string.Empty 是一个静态只读字段,不是一个常量

使用 C# 语言编写字符串常量的时候,你可能会发现可以使用 "" 不能使用 string.Empty。...进一步可以发现 string.Empty 实际上是一个静态只读字段,不是一个常量。 为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段?...(注意不是静态构造函数,String 类的静态构造函数是特殊处理不会调用的); 如果这是一个静态字段,那么编译器可以在不做特殊处理的情况下,生成 ldsfld string [mscorlib]System.String...Framework 4.0 及以前是可以反射修改其值的,这会造成相当多的基础组件不能正常工作,在 .NET Framework 4.5 和以后的版本,以及 .NET Core 中,CLR 运行时已经不允许你做出这么出格儿的事了...不过,如果你使用不安全代码(unsafe)来修改这个字段的值就当我没说。

1K00

关于C++中操作符重载的疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么?...现在先说说赋值运算符“=”的重载 C++规定赋值运算符“=”只能重载为类的非静态成员函数不可以重载为类的友元函数。...不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员。赋值运算符“=”是基于对象操作的。...那么为什么赋值运算符不可以重载为类的友元函数?像同样都是双目运算符的+为什么它就可以?...程序是不允许有矛盾不确定选择的,所以当赋值运算符重载为类的友元函数时,编译器就会提示错误。 对于剩下的3个运算符 ->, [], () 为什么不能重载为友元函数,也是跟上面一样的道理。

98220

会写「18.dp」只是个入门——Kotlin 的扩展函数和属性(Extension FunctionsProperties)

为什么?很简单,因为 Integer、Float、Double 这几个类没提供这个方法,所以我们只能用 Math 类的静态方法。...那它为什么可以被这个类的对象调用?——因为它在函数名的左边呀!...指向扩展函数的引用 在之前 Lambda 那一期视频里,我说过函数是可以使用双冒号被指向的对吧: Int::toFloat 我当时也讲了,其实指向的并不是函数本身,而是和函数等价的一个对象,这也是为什么你可以对这个引用调用...因为你拿到的是函数引用不是调用者的对象,所以没办法在左边写上调用者啊,是吧?所以 Kotlin 要想支持让我们拿着函数的引用去调用,就必须给个途径让我们提供调用者。那提供怎样的途径?...(Int) -> Unit = ::method3 "rengwuxian".method3(1) // 不允许调用,报错 "rengwuxian".f(1) // 可以调用 这就很爽了哈?

91810

小朋友好好学学lambda表达式吧!

1为什么使用Lambda表达式 先看几段Java8以前经常会遇到的代码: 创建线程并启动 // 创建线程 public class Worker implements Runnable { @Override...什么是函数式接口?它包含了以下特征: 接口中仅有一个抽象方法,但允许存在默认方法和静态方法。...只是Java8并未叫这个名字。对于自由变量,如果Lambda表达式需要引用,是不允许发生修改的。...于是Java8的设计人员就想出了这个办法:在接口中新增加一个方法类型,叫默认方法,可以提供默认的方法实现,这样实现类如果不实现方法的话,可以默认使用默认方法中的实现。...Lambda表达式后可以大幅减少冗余的模板式代码,使把更多注意力放在业务逻辑上,不是复制一堆重复代码, 除非你在一个用代码行数来衡量工作量的公司,你觉得

30220

CompletableFuture真香,可以替代CountDownLatch!

但如果回调中嵌入了回调?如果层次很深,就是回调地狱。Java中的CompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美存在的。...run的参数是Runnable,supply的参数是Supplier。前者没有返回值,而后者有,否则没有什么两样。 这两组静态函数,都提供了传入自定义线程池的功能。...如果你用的不是外置的线程池,那么它就会使用默认的ForkJoin线程池。默认的线程池,大小和用途你是控制不了的,所以还是建议自己传递一个。 典型的代码,写起来是这个样子。...在“多个任务等待完成状态”这个应用场景,CompletableFuture已经成了我的首选。 唯一的问题是,它的函数有点多,你需要熟悉一小段时间。...另外,有一个小小的问题,个人觉得,这个类如果叫做Promise的话,就能够和JS的统一起来,算是锦上添花吧。 作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。

1.3K40

C++类初识-有了对象之后

C++中类是怎样的?本文将结合C语言,来介绍C++中的类。 乐一乐 问:C++的书为什么比C厚那么多? 答:有了对象后就是麻烦。...,就需要通过调用getAge函数来访问数据成员,不是直接访问了: human.getAge(); 封装有什么好处?...是类似的,即使用sizeof计算其大小时,只需要计算其非静态数据成员大小(严格来说,是非静态数据成员,虚函数,虚基类),所以对于64位程序来说,sizeof(Human)的大小为24字节(需要考虑字节对齐...但是需要特别注意的是,C++类允许没有数据成员,那么一个没有数据成员的类(没有非静态数据成员变量,没有虚函数,也没有虚基类),大小是多少?...为什么?C++标准里规定,为了避免不同的对象具有相同的地址,对象大小不允许为0。

50010

c++中explicit和mutable关键字探究

1. explicit关键字 在写c++标准输入输出相关文章,查看iostream实现代码的时候,经常看到构造函数前面带有explicit关键字,那么它到底有什么作用。...main() { Base base = 5; base.print(); base = 6; base.print(); return 0; } 声明一个只有一个int类型私有成员变量的类,这个时候没有使用...那么为什么explicit可以起到这个作用,在没有声明该关键字之前,编译器根据当前的定义和构造函数,在编译的时候做了一个隐式的类型转换,但是当编译器发现了explicit这个关键字之后,就不再做这个隐式转换...总结:explicit告诉别人,不允许隔墙修改我家钱的数量,你要修改的话,必须进到屋子里才行。...2. mutable关键字 mutable用于类的非静态和非常量数据成员,一般类的成员函数被声明为const,就表示不会修改类的数据成员,但如果要在常成员函数中修改类的非静态和非常量数据成员,则可以使用

25520

这一篇让你彻底搞懂 JAVA内部类

** 可是为什么内部类就可以随意访问外部类的成员?** 是如何做到的?...# 1.3 内部类可以实现 java 单继承的缺陷 我们知道 java 是不允许使用 extends 去继承多个类的。内部类的引入可以很好的解决这个事情。...静态内部类可以访问外部类的静态变量,不可访问外部类的非静态变量; 非静态内部类的非静态成员可以访问外部类的非静态变量。 静态内部类的创建不依赖于外部类,而非静态内部类必须依赖于外部类的创建创建。...局部内部类有两点值得我们注意的地方: 局部内类不允许使用访问权限修饰符 public private protected 均不允许 局部内部类对外完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的...那么此时匿名内部类还有可能在堆中存储着,那么匿名内部类要到哪里去找这个局部变量

19020
领券