C++字面值常量类

数据成员都是字面值类型的聚合类是字面值常量类。如果一个类不是聚合类,但它符合以下要求,则它也是一个字面值常量类:

  • 数据成员都必须是字面值类型(算术类型,引用和指针,以及字面值常量类)。
  • 类必须至少含有一个constexpr构造函数。
  • 如果一个数据成员含有类内初始值,则内置类型的初始值必须是一条常量表达式。或者如果成员属性某种类类型,则初始值必须使用成员自己的constexpr构造函数。
  • 类必须使用析构函数的默认定义,该成员负责销毁类的对象。
  • 由于constexpr构造函数要满足构造函数的要求所以不能有返回语句,又要满足constexpr函数的要求唯一可执行的语句就是返回语句,所以constexpr构造函数体只能是空的。

字面值常量类同样也会在编译期进行计算,通过IDA反编译可以看到6和30是直接给出的,不是运行时算出来的。

class ConstPoint
{
public:
	constexpr ConstPoint(int x, int y) :
		x_(x), y_(y) {}
	void setX(int value) { x_ = value; };
	void setY(int value) { y_ = value; };
	constexpr int getX() { return x_; };
	constexpr int getY() { return y_; };
private:
	int x_;
	int y_;
};


int main()
{
 
	ConstPoint point(2, 5);
	point.setX(point.getX()*point.getX()+ point.getX());
	point.setY(point.getY()*point.getY()+point.getY());
	std::cout << point.getX() << " " << point.getY() << std::endl;
	system("pause");
	return 0;
}
int __cdecl main()
{
  std::basic_ostream<char,std::char_traits<char> > *v0; // eax
  const char *v1; // ecx
  std::basic_ostream<char,std::char_traits<char> > *v2; // eax
  std::basic_ostream<char,std::char_traits<char> > *v3; // esi
  int v4; // ecx
  std::ctype<char> *v5; // eax
  void (__thiscall ***v6)(_DWORD, signed int); // eax
  std::locale _Loc; // [esp+8h] [ebp-18h]
  char _Ch[4]; // [esp+10h] [ebp-10h]
  int v10; // [esp+1Ch] [ebp-4h]

  v0 = std::basic_ostream<char,std::char_traits<char>>::operator<<(&std::cout, 6);
  v2 = std::operator<<<std::char_traits<char>>(v0, v1);
  v3 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v2, 30);
  v4 = *(_DWORD *)&v3->gap0[*(_DWORD *)(*(_DWORD *)v3->gap0 + 4) + 48];
  v10 = 0;
  _Loc._Ptr = *(std::locale::_Locimp **)(v4 + 4);
  ((void (*)(void))_Loc._Ptr->vfptr->_Incref)();
  v10 = 1;
  v5 = std::use_facet<std::ctype<char>>(&_Loc);
  _Ch[0] = ((int (__thiscall *)(std::ctype<char> *, signed int))v5->vfptr[2]._Decref)(v5, 10);
  v10 = 2;
  if ( _Loc._Ptr )
  {
    v6 = (void (__thiscall ***)(_DWORD, signed int))((int (*)(void))_Loc._Ptr->vfptr->_Decref)();
    if ( v6 )
      (**v6)(v6, 1);
  }
  v10 = -1;
  std::basic_ostream<char,std::char_traits<char>>::put(v3, _Ch[0]);
  std::basic_ostream<char,std::char_traits<char>>::flush(v3);
  system("pause");
  return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值