C++ 能给我一个C++;编译器在编译时实例化对象?
我正在编写一些代码,其中包含大量相当简单的对象,我希望在编译时创建它们。我认为编译器可以做到这一点,但我还没有弄清楚如何做到 在C中,我可以执行以下操作:C++ 能给我一个C++;编译器在编译时实例化对象?,c++,optimization,gcc,C++,Optimization,Gcc,我正在编写一些代码,其中包含大量相当简单的对象,我希望在编译时创建它们。我认为编译器可以做到这一点,但我还没有弄清楚如何做到 在C中,我可以执行以下操作: #include <stdio.h> typedef struct data_s { int a; int b; char *c; } info; info list[] = { 1, 2, "a", 3, 4, "b", }; main() { int i; for (i
#include <stdio.h>
typedef struct data_s {
int a;
int b;
char *c;
} info;
info list[] = {
1, 2, "a",
3, 4, "b",
};
main()
{
int i;
for (i = 0; i < sizeof(list)/sizeof(*list); i++) {
printf("%d %s\n", i, list[i].c);
}
}
#包括
类型定义结构数据{
INTA;
int b;
char*c;
}信息;
信息列表[]={
1、2、“a”,
3、4、“b”,
};
main()
{
int i;
对于(i=0;i
使用#C++*可以调用每个对象的构造函数,而不仅仅是在内存中进行布局
#include <iostream>
using std::cout;
using std::endl;
class Info {
const int a;
const int b;
const char *c;
public:
Info(const int, const int, const char *);
const int get_a() { return a; };
const int get_b() { return b; };
const char *get_c() const { return c; };
};
Info::Info(const int a, const int b, const char *c) : a(a), b(b), c(c) {};
Info list[] = {
Info(1, 2, "a"),
Info(3, 4, "b"),
};
main()
{
for (int i = 0; i < sizeof(list)/sizeof(*list); i++) {
cout << i << " " << list[i].get_c() << endl;
}
}
#包括
使用std::cout;
使用std::endl;
班级信息{
常数INTA;
常数int b;
常量字符*c;
公众:
信息(常量整型,常量整型,常量字符*);
const int get_a(){返回a;};
const int get_b(){return b;};
const char*get_c()const{return c;};
};
Info::Info(constinta,constintb,constchar*c):a(a),b(b),c(c){};
信息列表[]={
信息(1,2,“a”),
信息(3,4,“b”),
};
main()
{
对于(int i=0;i C++ 2011中的CUT< P>可以在编译时创建对象。但是,要做到这一点,需要做各种各样的常量表达式,但是:
需要声明构造函数constexpr
您声明的实体需要声明constexpr
请注意,几乎所有的常量
限定符都不相关或位于错误的位置。下面是一个示例,其中有各种更正,并实际演示了列表
数组是在编译时初始化的(通过使用其成员定义枚举
):
#包括
#包括
班级信息{
INTA;
int b;
字符常量*c;
公众:
常量表达式信息(int,int,char const*);
constexpr int get_a()const{return a;}
constexpr int get_b()const{return b;}
constexpr char const*get_c()const{return c;}
};
常量表达式信息::信息(整数a、整数b、字符常量*c)
:a(a)、b(b)、c(c){
constexpr信息列表[]={
信息(1,2,“a”),
信息(3,4,“b”),
};
枚举{
b0=列表[0]。获取_b(),
b1=列表[1]。获取_b()
};
int main()
{
STD::CUT有一个静态类或单体IDOM。也许这就是C++中你所寻找的答案,你得到的答案是什么?@ NJOZEL C++没有静态类。@ DCOMPLA:我对你的问题的回答是:“C++的方式没有提到”当然,作者假定错误的标题是相对的,它可能给出了实际问题,显然使用C++而不是C.不<代码> A< <代码> >代码> B<代码>,要求<代码> const <代码> > <代码> COSTEXPROGESTA < /C> >是合法的吗?或者可以<代码> conExpRe>代码>对象可修改吗?(我知道它们是私有的,但是如果我在Info
对象上登录a
会发生什么?@ted:成员不需要是constepr
,因为整个对象都是constepr
。如果你想从一个非const
对象中获取constepr
,但访问一个成员,那么该成员需要是constexpr
(当然,还有定义此成员的各种其他内容)。感谢您的解释。您是指您的写作地点吗?呃,是的:应该是。
#include <iostream>
#include <iterator>
class Info {
int a;
int b;
char const*c;
public:
constexpr Info(int, int, char const*);
constexpr int get_a() const { return a; }
constexpr int get_b() const { return b; }
constexpr char const*get_c() const { return c; }
};
constexpr Info::Info(int a, int b, char const*c)
: a(a), b(b), c(c) {}
constexpr Info list[] = {
Info(1, 2, "a"),
Info(3, 4, "b"),
};
enum {
b0 = list[0].get_b(),
b1 = list[1].get_b()
};
int main()
{
std::cout << "b0=" << b0 << " b1=" << b1 << "\n";
for (Info const* it(list), *end(list); it != end; ++it) {
std::cout << (it - list) << " " << it->get_c() << "\n";
}
}