c++ 常量表达式_c语言所有函数

c++ 常量表达式_c语言所有函数constexpr修饰函数。普通函数/类成员函数。1.函数必须要有返回值,并且return返回的表达式必须是常量表达式。错误代码如下:#include<iostream>usingnamespacestd;//error不是常量表达式函数constexprvoidfunc1(){ inta=200; cout<<a<<endl;}//error不是常量表达式函数因为a是变量,不是常量constexprint

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

constexpr修饰函数。

普通函数/类成员函数。

1.函数必须要有返回值,并且return返回的表达式必须是常量表达式。

代码如下:

#include <iostream>
using namespace std;

//error 不是常量表达式函数
constexpr void func1()
{ 
   
	int a = 200;
	cout << a << endl;
}


//error 不是常量表达式函数 因为a是变量,不是常量
constexpr int func2()
{ 
   
	int a = 100;
	return a;
}

2.函数在使用之前,必须有对应的定义语句。

代码如下:

#include <iostream>
using namespace std;

constexpr int func1();

int main()
{ 
   
	constexpr int num = func1();   //error

	return 0;
}

constexpr int func1()
{ 
   
	constexpr int a = 100;
	return a;
}

在测试程序constexpr int a = func1();中,还没有定义func1()就直接调用了,应该将func1()函数的定义放到main函数的上边。

3.整个函数的函数体中,不能出现非常量表达式之外的语句(using 指令,typedef 语句以及static_assert断言,return语句除外)

代码如下:

#include <iostream>
using namespace std;

//error
constexpr int func1()
{ 
   
	constexpr int a = 100;
	constexpr int b = 10;
	for (int i = 0; i < b; i++)
	{ 
   
		cout << "i = " << i << endl;
	}
	return a + b;
}

//ok
constexpr int func2()
{ 
   
	using myType = int;
	constexpr myType a = 100;
	constexpr myType b = 10;
	constexpr myType c = a * b;
	return c - (a + b);
}

因为func1()是一个常量表达式函数,在函数体内部是不允许出现非常量表达式以外的操作,因此函数体内部的for循环是一个非法操作。

代码如下:

#include <iostream>
using namespace std;

//OK
class Test
{ 
   
public:
	constexpr int func()
	{ 
   
		constexpr int var = 100;
		return 5 * var;
	}
};

int main()
{ 
   
	Test t;
	constexpr int num = t.func();
	cout << "num = " << num << endl;
	return 0;
}

模板函数。

C++11语法中,constexpr可以修饰模板函数,但由于模板中类型的不确定性,因此模板函数实例化后的函数是否符合常量表达式函数的要求也是不确定的。
如果constexpr修饰的模板函数实例化结果不满足常量表达式函数的要求,则constexpr会被自动忽略,即该函数就等同于一个普通函数。

代码如下:

#include <iostream>
using namespace std;

struct Person
{ 
   
	const char *name;
	int age;
};

template <typename T>
constexpr T display(T t)
{ 
   
	return t;
}

int main()
{ 
   
	Person p{ 
    "Tom",18 };
	Person ret = display(p);//非常量表达式 普通函数

	cout << "name = " << ret.name << " age = " << ret.age << endl;

	constexpr Person p1{ 
    "Jack",19 };
	constexpr Person ret1 = display(p1);//常量表达式函数

	cout << "name = " << ret1.name << " age = " << ret1.age << endl;

	constexpr int ret2 = display(250);//常量表达式函数
	cout << ret2 << endl;


	return 0;
}

测试结果:
c++ 常量表达式_c语言所有函数

类的构造函数。

如果想用直接得到一个常量对象,也可以用constexpr修饰一个构造函数,这样就可以得到一个常量构造函数。

常量构造函数要求:
构造函数的函数体必须为空,并且用初始化列表的方式为各个成员赋值。

代码如下:

#include <iostream>
using namespace std;

//error
/*struct Person { Person(const char *name, int age) :name(name), age(age) {} const char *name; int age; };*/

struct Person
{ 
   

	constexpr Person(const char *name,int age):name(name),age(age){ 
   }
	const char *name;
	int age;
};

int main()
{ 
   
	constexpr  Person p("Tom", 18);
	cout << "name = " << p.name << " age = " << p.age << endl;
	return 0;
}

测试结果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188455.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 托尔斯泰《安娜·卡列尼娜》主要人物

    托尔斯泰《安娜·卡列尼娜》主要人物版本:上海译文2013版译者高慧群等奥博朗斯基公爵:斯捷潘·阿尔卡季奇·奥勃朗斯基公爵(在社交场合他叫斯季瓦)达里娅·亚历山德罗夫娜,小名多莉,公爵夫人格里沙——小儿子塔尼娅——大女儿,与安娜八岁的谢廖扎同年马特维——仆人马特廖娜·菲利莫诺夫娜——奶妈马特廖莎,捷连季——车夫阿尼奇金伯爵——斯季瓦的新任长官瓦尔瓦拉,公爵小姐——斯捷潘的姑妈,多莉早就认识她,对她并不尊重。她知道公爵小姐瓦尔瓦拉整个一生都在富裕的亲戚家里当食客。斯季瓦说,她一生的整个目标就是要证明自己比卡捷琳娜·帕夫洛

  • 2021 Pychram激活码_通用破解码

    2021 Pychram激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 我在滴滴数据分析岗实习8个月的收获(文末附内推机会)

    我在滴滴数据分析岗实习8个月的收获(文末附内推机会)作者:海潮来源:数据管道大家好,我是宝器!今天分享一下交流群里海潮兄弟的「数据分析岗」求职与工作经验,以下是海潮兄弟的自诉,全文共4825字,6图,阅读大概需要15分…

  • JS数组的定义

    JS数组的定义

  • nfs之端口设置

    nfs之端口设置1,修改/etc/sysconfig/nfs文件  MOUNTD_PORT="4002"STATD_PORT="4003"LOCKD_TCPPORT="4004"LOCKD_UDPPORT="4004"查看rpcinfo-p能看到mouted_port=4002,其余三项未显示2,tcp 1112049端口udp111 4046端口 把…

  • realsense深度图像保存方法

    realsense深度图像保存方法一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。在众多图像库中,一般会使用opencv中的imwrite()函数进行深度图像的保存。一般深度图像中深度值的单位是mm,因此一般使用np.uint16作为最终数据格式保存。例子:importnumpyasnpimportcv2deffun1(…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号