问两个why:为啥关键字static friend不能出现在定义里面?

方紫涵 2013-11-29 03:43:01
1)友元关键字friend:在声明里面必须要求有,在定义时候不能有,否则报编译错误//问下why设计成这样?

2)静态数据成员static:在声明里面必须要求有,在定义的时候不能有,否则会报编译错误。//问下why设计成这样?

3)缺省参数:放在在声明里面,在定义里面不能出现。林锐认为:参数默认值与定义无关且方便修改////问下why设计成这样?

4)inline:原则上声明和定义的时候都可以出现,但是林锐认为inline不能出现在函数声明中,用户没有必要知道函数是否内联。//问下why设计成这样?

...全文
318 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-01-04
  • 打赏
  • 举报
回复
引用 14 楼 xwhbwas2008 的回复:
[quote=引用 12 楼 lm_whales 的回复:] 类的成员变量, const 加不加,表示不同的对象(常量,变量),同时出现,构成命名冲突。
"同时出现,构成命名冲突" 这个话怎么理解阿? [/quote] 定义同名的常量和变量各一个,不是命名冲突么,不过一般不会出现这样的代码就是了。
方紫涵 2014-01-03
  • 打赏
  • 举报
回复
引用 12 楼 lm_whales 的回复:
类的成员变量, const 加不加,表示不同的对象(常量,变量),同时出现,构成命名冲突。
"同时出现,构成命名冲突" 这个话怎么理解阿?
方紫涵 2013-12-16
  • 打赏
  • 举报
回复
引用 7 楼 mougaidong 的回复:
1. 友元是个相互作用的关键字,只存在于表明双方关系的场景中(旨在表明谁是谁的什么),单方面不能使用。 2. 不懂。 坐等高人。 3. 默认形参放到实现文件中,不是不好,是没有用的,得到编译时错误。 4. 其实,我个人认为林锐博士的这句话,很容易引起误会。我想他的意思是,用inline的时候,你就不要把声明和实现的分开了,就把实现当成一种分明放到头文件中好了。 否则,只放把inline放到实现中,是没有用的,它可能仅在它所在的编译单元起作用的(当然,这就跟编译器实现很相关了),对于别的cpp文件来说是看见inline的。 [quote=引用 2 楼 Adol1111 的回复:] 1、友元函数表示的是这个函数不是我的成员,但可以使用我的成员数据。换个角度来说,也就是有点特殊的普通函数,普通函数定义分离后脱离了类,那么就是一个普通函数,为什么需要friend。 2、看看lippman的《深度探索C++对象模型》,对C++的对象模型来说,static函数其实是非成员函数的形式,他是在类外的,所以不存在同时指定static和::。对象模型有点复杂,等你学会C++的基础后可以一点点去深入了解。 3、等你做过大型项目你就知道了,对于C/C++来说,管理头文件比管理实现文件更重要。人们更愿意去维护、查看头文件而不是实现文件。所以放在声明里是合理的。你会去别人写的一堆代码里找缺省,还是直接看头文件? 4、inline其实只是编译器的一种优化,而且inline有个问题,当代码比较复杂时,inline会失去作用。所以对用户来说是否是inline的一点也不重要。
[/quote] 又发现一个 1)static const: 声明时候public: static const int MASK; 类外定义的死后去掉staic但是const保留了:const int Test::MASK = 0xFFFF; 也就是说static const中的const在定义和声明的时候都必要要有?why ?
Todd_Pointer 2013-12-16
  • 打赏
  • 举报
回复
关于static有个说法:被static修饰的标识符只在其所在作用域中有效,并在其所在作用域有效其间一直有效(英文按记忆翻译,措辞可能不准)。 所以,static在类成员声明时用说明该成员在类中有效,如果在类外再来一遍语义就冲突了。 friend是指被修饰的类或函数拥有访问当前类的私有成员的权限,如果用在类外就没法解释了,总不能说被修饰的类或函数可以访问全局的私有成员吧? 默认参数并不影响当前函数的行为,而是影响调用方,调用方代码如果没有显示指定具体默认值的参数的值,则编译器需要在编译时使用默认参数补齐。 因此默认参数应该放在调用方看得到的地方。 对于 inline ,我并不是很理解林锐的说法。 inline理论上应该是给调用方(用户)作参考的,告诉调用方(用户)当前函数应该被内联,所以我以为,inline应该在函数声明上才有意义。 当然话说回来, 现在很多编译器在文档中都粗暴的表示它们会无视任何inline明示与暗示, 理由是程序员们太笨了,根本不能正确评估是否应该inline,所以这事还是交给它们这些聪明的编译器来全权处理吧。 另外,从语法上讲,类成员函数内联实现即表示该函数拥有inline修饰,这个应该也算是声明上的吧。
lm_whales 2013-12-16
  • 打赏
  • 举报
回复
类的成员变量, const 加不加,表示不同的对象(常量,变量),同时出现,构成命名冲突。 类内 static 加了表示静态成员,不加表示非静态成员。 类外不加static,表示只是类作用域的 static 变量; 类外,只是定义一下,类作用域的静态成员变量而已,所以不加。 当初,也许认为,类静态成员变量, 不是类对象的成员,所以不在类内定义。
lm_whales 2013-12-16
  • 打赏
  • 举报
回复
1) 定义的时候,该函数或者类,不在把他定义为友元的作用域中。 友元的声明只能在类作用域中,才有效,表示该函数(友元函数)或者类(友元类) 可以访问把它声明为友元的类的私有成员,保护成员。 2)外部加static 就称为类外作用域的静态成员了,或者说造成二义性。 内部不加,则是类的非静态成员。 3)默认参数,应该视为函数声明的一部分。 二者不能同时定义,默认参数,是为了防止定义不同的默认参数。 个人认为,应该不允许定义的时候定义默认参数才行。 也可能是,为了inline 函数着想,因为 inline 不需要单独声明,只有定义就行了。 4)inline 函数定义,等同于声明,没有必要单独声明。 因为可能整个函数都会嵌入调用处,而且嵌入的时候必须知道,inline 函数定义,而不是声明。 不需要再有个声明,表示有这么一个函数。 没有定义,有这个声明也没有用,不能实现inline 有这个定义,定义本身就起到声明的作用,何必再声明一遍。
Adol1111 2013-11-30
  • 打赏
  • 举报
回复
引用 7 楼 mougaidong 的回复:
1. 友元是个相互作用的关键字,只存在于表明双方关系的场景中(旨在表明谁是谁的什么),单方面不能使用。 2. 不懂。 坐等高人。 3. 默认形参放到实现文件中,不是不好,是没有用的,得到编译时错误。 4. 其实,我个人认为林锐博士的这句话,很容易引起误会。我想他的意思是,用inline的时候,你就不要把声明和实现的分开了,就把实现当成一种分明放到头文件中好了。 否则,只放把inline放到实现中,是没有用的,它可能仅在它所在的编译单元起作用的(当然,这就跟编译器实现很相关了),对于别的cpp文件来说是看见inline的。
第三点应该不会有编译错误的吧,至少VS下没有报错,标准上应该没说吧。除非你在声明和定义中同时指定缺省。不过最好是放在头文件中,可以避免不必要的麻烦。举个例子:
//A.h
class A{
public:
	A(int i);
private:
	int i;
};
//main.cpp
#include "A.h"

int main(){
	A a;//此时只有A(int i);看不到缺省,编译失败了。
	return 0;
}

A::A(int i=0):i(i){}
第四点的话,一般inline都是放头文件里的吧,不然inline的效果就没有了。
turing-complete 2013-11-30
  • 打赏
  • 举报
回复
1. 友元是个相互作用的关键字,只存在于表明双方关系的场景中(旨在表明谁是谁的什么),单方面不能使用。 2. 不懂。 坐等高人。 3. 默认形参放到实现文件中,不是不好,是没有用的,得到编译时错误。 4. 其实,我个人认为林锐博士的这句话,很容易引起误会。我想他的意思是,用inline的时候,你就不要把声明和实现的分开了,就把实现当成一种分明放到头文件中好了。 否则,只放把inline放到实现中,是没有用的,它可能仅在它所在的编译单元起作用的(当然,这就跟编译器实现很相关了),对于别的cpp文件来说是看见inline的。
引用 2 楼 Adol1111 的回复:
1、友元函数表示的是这个函数不是我的成员,但可以使用我的成员数据。换个角度来说,也就是有点特殊的普通函数,普通函数定义分离后脱离了类,那么就是一个普通函数,为什么需要friend。 2、看看lippman的《深度探索C++对象模型》,对C++的对象模型来说,static函数其实是非成员函数的形式,他是在类外的,所以不存在同时指定static和::。对象模型有点复杂,等你学会C++的基础后可以一点点去深入了解。 3、等你做过大型项目你就知道了,对于C/C++来说,管理头文件比管理实现文件更重要。人们更愿意去维护、查看头文件而不是实现文件。所以放在声明里是合理的。你会去别人写的一堆代码里找缺省,还是直接看头文件? 4、inline其实只是编译器的一种优化,而且inline有个问题,当代码比较复杂时,inline会失去作用。所以对用户来说是否是inline的一点也不重要。
lm_whales 2013-11-30
  • 打赏
  • 举报
回复
关于友元 友元函数是一种类外部的函数,包括其他类的函数。 但是他是类的接口。 友元函数的声明,是类定义的一部分。
dyw 2013-11-30
  • 打赏
  • 举报
回复
这样设计不是更方便吗?不易引起歧义,减少混乱。编译器只需检查.h中的定义,而不必再在.cpp中检出这些定义。其实就是声明与实现的分离。反过来想,当.h与.cpp都有同样的定义,那以哪一个为准呢?万一有拼写错误,岂不是无故又多了一份定义?!
derekrose 2013-11-29
  • 打赏
  • 举报
回复
楼主是学生吧,思考的很深入啊,但是还不够深入,我这样问你一下,c++为什么要有声明和定义,弄懂了这个,你就全明白了,其实这四个问题的答案是一个
Adol1111 2013-11-29
  • 打赏
  • 举报
回复
引用 3 楼 xwhbwas2008 的回复:
Adol1111 高人! 问下阁下作c++多少时间了 ?
学了没几年,看的杂书多了,项目做多了,就自然提升了。我其实还是很菜的。
方紫涵 2013-11-29
  • 打赏
  • 举报
回复
Adol1111 高人! 问下阁下作c++多少时间了 ?
Adol1111 2013-11-29
  • 打赏
  • 举报
回复
1、友元函数表示的是这个函数不是我的成员,但可以使用我的成员数据。换个角度来说,也就是有点特殊的普通函数,普通函数定义分离后脱离了类,那么就是一个普通函数,为什么需要friend。 2、看看lippman的《深度探索C++对象模型》,对C++的对象模型来说,static函数其实是非成员函数的形式,他是在类外的,所以不存在同时指定static和::。对象模型有点复杂,等你学会C++的基础后可以一点点去深入了解。 3、等你做过大型项目你就知道了,对于C/C++来说,管理头文件比管理实现文件更重要。人们更愿意去维护、查看头文件而不是实现文件。所以放在声明里是合理的。你会去别人写的一堆代码里找缺省,还是直接看头文件? 4、inline其实只是编译器的一种优化,而且inline有个问题,当代码比较复杂时,inline会失去作用。所以对用户来说是否是inline的一点也不重要。
方紫涵 2013-11-29
  • 打赏
  • 举报
回复
上面的内容是我总结的,有错误的地方希望大家指出来

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧