Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的结构构造函数+;?_C++_Struct_Constructor - Fatal编程技术网

C++ C+中的结构构造函数+;?

C++ C+中的结构构造函数+;?,c++,struct,constructor,C++,Struct,Constructor,可以在C++中使用构造函数< /p> 我一直在尝试解决这个问题,但我没有得到语法。C++中的< P> > 类< /COD>和结构>代码>,默认情况下,成员和基类在类中是私有的,而在结构中默认为公共的。p> struct TestStruct { int id; TestStruct() : id(42) { } }; 因此结构可以有构造函数,语法与类相同。是。结构与类类似,但在类定义中和继承时默认为public:: struct

可以在C++中使用构造函数< /p>

我一直在尝试解决这个问题,但我没有得到语法。C++中的

< P> > <代码>类< /COD>和结构>代码>,默认情况下,成员和基类在类中是私有的,而在结构中默认为公共的。p>
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};

因此结构可以有构造函数,语法与类相同。

是。结构与类类似,但在类定义中和继承时默认为
public:

struct Foo
{
    int bar;

    Foo(void) :
    bar(0)
    {
    }
}

考虑到你的另一个问题,我建议你通读一遍。他们会比我们更快更快地回答你的问题。

< P>是,C++中的结构和类是相同的,除了默认情况下结构成员是公共的,而默认情况下类成员是私有的。在类中可以做的任何事情都应该能够在结构中完成

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};

是的,但是如果你有一个联盟的结构,那么你就不能。它和一门课是一样的

struct Example
{
   unsigned int mTest;
   Example()
   {
   }
};

联合不允许在结构中使用构造函数。不过,您可以在联合体上创建构造函数
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

我宁愿在构造函数内部初始化,这样我就不需要保持顺序。

是的,在结构中有构造函数是可能的。下面是一个示例:

#include<iostream.h> 
struct a {
  int x;
  a(){x=100;}
};

int main() {
  struct a a1;
  getch();
}
#包括
结构a{
int x;
a(){x=100;}
};
int main(){
结构a1;
getch();
}

以上所有答案从技术上回答了提问者的问题,但我只是想指出一个你可能会遇到问题的案例

如果您这样声明结构:

typedef struct{
int x;
foo(){};
} foo;
MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};
您在尝试声明构造函数时会遇到问题。当然,这是因为您实际上没有声明名为“foo”的结构,而是创建了一个匿名结构,并为其指定了别名“foo”。这也意味着您将无法将“foo”与cpp文件中的作用域运算符一起使用:

foo.h:

typedef struct{
int x;
void myFunc(int y);
} foo;
foo.cpp:

//<-- This will not work because the struct "foo" was never declared.
void foo::myFunc(int y)
{
  //do something...
}
或者这个:

typedef struct foo{
int x;
foo(){};
} foo;

其中创建了一个名为“FO”的结构,并赋予它别名“FO”,这样当引用它时,就不必使用<代码>结构> /COD>关键字。

< P>,正如其他答案所提到的,结构基本上被视为C++中的类。这允许您拥有一个构造函数,该构造函数可用于使用默认值初始化结构。下面,构造函数将
sz
b
作为参数,并将其他变量初始化为一些默认值

struct blocknode
{
    unsigned int bsize;
    bool free;
    unsigned char *bptr;
    blocknode *next;
    blocknode *prev;

    blocknode(unsigned int sz, unsigned char *b, bool f = true,
              blocknode *p = 0, blocknode *n = 0) :
              bsize(sz), free(f), bptr(b), prev(p), next(n) {}
};
用法:

unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);

< C++ >代码> >结构> <代码> <代码>类<代码>,除<代码>结构> <代码>默认成员访问说明符>代码>公用< /Cl> >类>代码>私下< /代码> .< <> >在C++中,使用<代码>结构> <代码>的原因是C++的超集,必须与代码<向后兼容>遗留C类型< /C> > < /P>

例如,如果语言用户试图在C++代码中包含一些C头文件<代码> LeCACY-C.H./Cuth>,它包含“代码>结构测试{INTX,Y};<代码>。<代码>结构测试< /代码>的成员应该是可访问的,就像C.

注意到有一个有趣的区别(至少是MS+C++编译器):


如果你有这样一个普通的结构

struct MyStruct {
   int id;
   double x;
   double y;
} MYSTRUCT;
然后,您可以在其他地方初始化这样的对象数组:

typedef struct{
int x;
foo(){};
} foo;
MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};
但是,只要您向MyStruct添加用户定义的构造函数(如上面讨论的构造函数),就会出现如下错误:

typedef struct{
int x;
foo(){};
} foo;
MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};
“MyStruct”:不聚合具有用户定义构造函数的类型
:错误C2552:“\u点列表”:无法使用非聚合
可以使用初始值设定项列表初始化。

这就是结构和类之间的另一个区别。这种初始化可能不是好的OO实践,但它在我支持的遗留WiSDK C++代码中到处可见。正如您所知,c++structc++class中的…

在默认情况下只有一个区别,结构成员是公共的,类成员是私有的

/*Here, C++ program constructor in struct*/ 
#include <iostream>
using namespace std;

struct hello
    {
    public:     //by default also it is public
        hello();    
        ~hello();
    };

hello::hello()
    {
    cout<<"calling constructor...!"<<endl;
    }

hello::~hello()
    {
    cout<<"calling destructor...!"<<endl;
    }

int main()
{
hello obj;      //creating a hello obj, calling hello constructor and destructor 

return 0;
}
<代码> /*这里,C++中的C++程序构造函数*/* #包括 使用名称空间std; 结构你好 { public://默认情况下,它也是公共的 你好; ~hello(); }; 你好::你好() {
CUT

语法与C++类一样,如果你意识到C++中构造了构造函数,那么在Stut.

中也同样如此。 结构日期 { 国际日; 日期(int d) { d=d; } 作废打印日() {
不能再举一个示例,但在构造函数中设置值时使用关键字:

#include <iostream>

using namespace std;

struct Node {
    int value;

    Node(int value) {
        this->value = value;
    }

    void print()
    {
        cout << this->value << endl;
    }
};

int main() {
    Node n = Node(10);
    n.print();

    return 0;
}
#包括
使用名称空间std;
结构节点{
int值;
节点(int值){
这个->值=值;
}
作废打印()
{

cout value下表简要说明了类别、结构和联合


当派生自:)@sth时,该结构将默认为public。您对结构和类之间的区别有权评论,但我认为他有一个编译问题。这个问题可能是因为使用该结构的联合体。联合体中不能有非平凡的构造函数。@Chap:如果他有具体问题在通用解决方案不起作用之前,发布一些显示问题和生成的编译器错误的代码可能是最好的主意。但是,尽管问题是一般性的,但我认为人们不能对OP试图解决的具体问题推断太多…@GMan:正确的想法,错误的措辞。
struct公开继承它的基类;从
结构派生的类没有任何更改