请问函数返回值为什么一定要加上名字空间?

srxumin 2018-05-03 11:28:48
#include <iostream>
using namespace std;

namespace xm
{
class A
{
public:
int a;
};

A fun(A a);
}

xm::A xm::fun(A a) //返回值为什么一定要加上xm?
{
cout << a.a << endl;
return a;
}
int main()
{
return 0;
}


xm::A xm::fun(A a)这一行,一个函数定义要加2个名字空间前缀,这样显的很麻烦,请问C++是出于什么目的要这样设计的?
...全文
831 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Imlym 2018-05-05
  • 打赏
  • 举报
回复
这个是极端的例子. 实际上项目中, 类名按功能详细命名, 没有冲突时就不需要加命名空间了
paschen 版主 2018-05-05
  • 打赏
  • 举报
回复
引用 15 楼 srxumin的回复:
[quote=引用 7 楼 paschen 的回复:] [quote=引用 4 楼 srxumin的回复:]那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
fun也是在xm名字空间下的,简化不了 因为你也可以定义一个不在xm空间的函数fun,但它参数和返回值是xm下的A类型 但此时参数你也要写成:xm::A,否则编译器不知道A[/quote] 我感觉你这个说法已经很接近答案了,但我觉得没这么简单,会不会编译器里面对待函数会将函数返回值和函数形参分开来处理?[/quote] 搜索:name mangling
paschen 版主 2018-05-05
  • 打赏
  • 举报
回复
引用 15 楼 srxumin的回复:
[quote=引用 7 楼 paschen 的回复:] [quote=引用 4 楼 srxumin的回复:]那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
fun也是在xm名字空间下的,简化不了 因为你也可以定义一个不在xm空间的函数fun,但它参数和返回值是xm下的A类型 但此时参数你也要写成:xm::A,否则编译器不知道A[/quote] 我感觉你这个说法已经很接近答案了,但我觉得没这么简单,会不会编译器里面对待函数会将函数返回值和函数形参分开来处理?[/quote] 搜索:name mangling
真相重于对错 2018-05-05
  • 打赏
  • 举报
回复
引用 15 楼 srxumin 的回复:
[quote=引用 7 楼 paschen 的回复:] [quote=引用 4 楼 srxumin的回复:]那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
fun也是在xm名字空间下的,简化不了 因为你也可以定义一个不在xm空间的函数fun,但它参数和返回值是xm下的A类型 但此时参数你也要写成:xm::A,否则编译器不知道A[/quote] 我感觉你这个说法已经很接近答案了,但我觉得没这么简单,会不会编译器里面对待函数会将函数返回值和函数形参分开来处理?[/quote] 你想的太多
srxumin 2018-05-05
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
[quote=引用 4 楼 srxumin的回复:]那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
fun也是在xm名字空间下的,简化不了 因为你也可以定义一个不在xm空间的函数fun,但它参数和返回值是xm下的A类型 但此时参数你也要写成:xm::A,否则编译器不知道A[/quote] 我感觉你这个说法已经很接近答案了,但我觉得没这么简单,会不会编译器里面对待函数会将函数返回值和函数形参分开来处理?
paschen 版主 2018-05-04
  • 打赏
  • 举报
回复
实际上函数参数在name magling已经包含在函数名了,而返回值却没有,所以参数可以不加,这也是函数不能以返回值不同而重载的原因
大米粥哥哥 2018-05-04
  • 打赏
  • 举报
回复
http://blog.sina.cn/dpool/blog/s/blog_af68a2c201015pqo.html
SHA-ZI 2018-05-04
  • 打赏
  • 举报
回复
因为你返回值是A
yshuise 2018-05-04
  • 打赏
  • 举报
回复
表示在这个范围内
ggglivw 2018-05-04
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
请百度"c++命名空间作用”
+1. 这个问题其实根本不用论坛问。我可以先说下,就是避免名字污染。比如你和其他人都定义了一个类叫item,这个时候就冲突了,有了这个前缀,就可以避免这个问题
paschen 版主 2018-05-04
  • 打赏
  • 举报
回复
引用 4 楼 srxumin的回复:
那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
fun也是在xm名字空间下的,简化不了 因为你也可以定义一个不在xm空间的函数fun,但它参数和返回值是xm下的A类型 但此时参数你也要写成:xm::A,否则编译器不知道A
Marcelxx 2018-05-04
  • 打赏
  • 举报
回复
放在不同的名字空间,防止命令冲突
真相重于对错 2018-05-04
  • 打赏
  • 举报
回复
请百度"c++命名空间作用”
棉猴 2018-05-04
  • 打赏
  • 举报
回复
《C++Primer第5版中文版》P7 命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。例如如下代码
namespace xm
{
	class A
	{
	public:
		int a;
	};

	A fun(A a);
}

class A
{
public:
	int a;
};
在xm命名空间中定义了类A,之后在xm命名空间之外定义了另外一个类A,此时这两个类不冲突。而如果在xm命名空间之外使用类A,则需要使用作用于操作符(::)。 《C++Primer第5版中文版》P74 作用域操作符的含义是:编译器应从操作符左侧名字所示的作用域中搜找右侧那个名字。所以
xm::A
的含义是在xm作用域中的类A。 如果感觉每次使用作用域操作符麻烦,则可以使用using声明。
{
	class A
	{
	public:
		int a;
	};

	A fun(A a);
}

using namespace xm;//using声明
A fun(A a)  //此时就不需要作用域操作符了
{
	cout << a.a << endl;
	return a;
}
请参考 《C++的标准库与命名空间》https://blog.csdn.net/hou09tian/article/details/77429930 《命名空间引起的函数声明问题》https://blog.csdn.net/hou09tian/article/details/70772021
我看你有戏 2018-05-04
  • 打赏
  • 举报
回复
类视图里面多加了一层, 好看 ,好找,好修改
srxumin 2018-05-04
  • 打赏
  • 举报
回复
那为什么C++的设计人员不把它设计成xm::A fun(A a)就只可以了,还要搞的这么麻烦?
qq_40162781 2018-05-04
  • 打赏
  • 举报
回复
那std::cout后面岂不都是std空间的了?
paschen 版主 2018-05-03
  • 打赏
  • 举报
回复
因为A在名字空间xm下,你也可以使用using xm::A; 之后不需要加名字空间

64,649

社区成员

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

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