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;
}

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一个好玩的小游戏(纯C语言编写)

    一个好玩的小游戏(纯C语言编写)最近在看知乎是发现了一个这一个专栏https://zhuanlan.zhihu.com/c2game从中获取的许多知识,本文中的游戏也是从里面学到的,不过本人又自己加了一些功能。这是一个类似于飞机大战的游戏,不过目前代码量比较小,所以看起来非常简陋游戏界面如下更新日志,本人将原来的原来的代码有进一步的优化了一下,之前是只有一个非常小的战机现在更新后可以产生一个非常大的战机(看起来也更

    2022年5月19日
    44
  • 网页添加背景音乐

    网页添加背景音乐为网页添加背景音乐的方法一般有两种,第一种是通过普通的标签来添加,另一种是通过标签来添加。(一)使用标签用Dreamweaver打开需要添加背景音乐的页面,点击“代码”打开代码编辑视图,在之间输入“Dreamweaver自动输入“空格键,代码提示框会自动将bgsound标签的属性列出来供你选择使用。bgsound标签共有五个属性,其中balance是设置音乐的左右均衡,delay是

    2022年9月24日
    1
  • c语言编程a4988驱动步进电机,A4988 步进电机驱动模块测试[通俗易懂]

    c语言编程a4988驱动步进电机,A4988 步进电机驱动模块测试[通俗易懂]A4988控制逻辑简单,主要分为睡眠、正反转、复位、使能、细分等模式控制。(1)睡眠模式:Sleep管脚电平置0,进入睡眠模式,驱动器输出待机模式;Sleep管脚置1,驱动器处于正常工作状态;(2)正反转模式:正转模式DIR管脚置0或1,反转模式置1或0;(3)复位模式:复位模式下容易消耗能量,产生的冲击电流较大。直接RESET管脚置1,在不影响系统工作时RESET管脚置0复位。一旦驱动芯片复位,…

    2022年6月17日
    25
  • zabbix 监控服务器_docker监控工具有哪些

    zabbix 监控服务器_docker监控工具有哪些服务器监控工具服务器监控工具功能相当强大,无论何时何地,我们都可以了解到服务器的功能以及性能。服务器监控工具的使用,可以让我们清楚的知道用户可以打开我们的网站,且确保网速不慢。只有这样做,才能留住宝贵的用户,以免因为系统停运的原因,导致用户丢失。监控工具:cacti、Nagios、Ganglia、zabbixcacti:它是一款数据采集、数据存储,外加web界面展示的工具,它的数据展示功能…

    2025年6月21日
    2
  • vue 计数器_74161计数器

    vue 计数器_74161计数器计数器的实现在页面上简单实现一个计数器<!DOCTYPEhtml><htmllang="en"><head><metach

    2022年8月7日
    5
  • Javascript贪食蛇小游戏

    试玩:http://hovertree.com/game/9/贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,

    2021年12月22日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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