Code Bye

请教一个关于constexpr的问题

#include <iostream>
class _A
{
public:
	_A();
	~_A();
	constexpr int b() { return c; } //①:这个可不可以类里声明,类外定义。
	int a(int _z);
private:
	int c;
	int d;
};
int _A::a(int _z)
{
	c = _z;
	return 0;
}
_A::_A()
{
	c = 0;
	d = 0;
}
_A::~_A()
{
}
int main()
{
	_A q;
	int w{ 0 };
	std::cin >> w;
	q.a(w);
	std::cout << q.b();
	return 0;
}

①的部分可不可以写成这样啊
class _A
{
public:
_A();
~_A();
constexpr int b();
int a(int _z);
private:
int c;
int d;
};
constexpr int _A::b()
{
return c;
}

解决方案

20

可以:
class _A
{
public:
	constexpr int b() const;
};
constexpr int _A::b() const
{
	return 2;
}

10

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

当然可以。
只是在看不到它的定义的地方,它不能用于一个常量表达式。

知道了 谢谢,,那像#2版主那样还是一个常量表达式 么,什么叫做看不到他定义的地方。

调用和定义不在一个(把 #include 都展开之后的)源文件里,那么调用的地方就是看不到定义。在同一个源文件(这个实际应该叫“编译单元”)里就是可见的。
C++ 常量表达式 的条件蛮复杂的,你不把程序写全不太好判断。
不过,假如调用与定义不在同一个编译单元的话,那么包含调用的表达式必然不是常量表达式。
================================================
constexpr int b() const; // 这个一个函数声明,不是表达式
constexpr int _A::b() const
{
return 2;
}  // 这个一个函数定义,也不是表达式
以上两个,都不是表达式,当然也就不是常量表达式。

不好意思刚刚是本人表述不当

#include <iostream>
class _A
{
public:
	_A();
	~_A();
	int a();
	constexpr int b() const;
private:
	int c;
};
int _A::a()
{
	int d;
	while (std::cin >> d)
	{
		std::cout << d << "   ";
		c++;
	}
	std::cout << std::endl;
	return 0;
}
constexpr int _A::b() const
{
	return c;                                       //本人想问的是这里的返回值c能否作为一个常量表达式。
}
_A::_A() :c{0}
{
}
_A::~_A()
{
}
int main()
{
	_A r;
	r.a();
	std::cout<<r.b();
	return 0;
}

不是。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教一个关于constexpr的问题