C++ 结构体 成员函数

#include <iostream>
using namespace std;
struct Foo
{
Foo() { }
Foo(int i) { int j = i; }
void fun(){ }
};
int main(void)
{
Foo a(10); //语句1
a.fun(); //语句2
Foo b(); //语句3
b.fun(); //语句4 求解释为什么编译出错
return 0;
}

C++允许在结构中定义函数,该函数称为成员函数。其描述形式如下:
struct 结构名{
数据成员
成员函数
}
下面是一个使用成员函数的例子
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

struct Point
{
double m,n;
void Setab(double a,double b)
{
m=a;
n=b;
}

void display()
{
cout<<"display()------>>" <<m<<"\t"<<n<<endl;
}
};

int main(int argc, char** argv)
{
Point p;
p.Setab(2,3);
p.display();
cout <<"数据成员"<<p.m<<"\t" <<p.n <<endl;
return 0;
}

总结:
1、用到了结构块 结构块中的函数调用的方法,写完上面程序发现C++的结构块像Java中静态方法,直接用结构名调用数据成员和成员函数;还有一个就是“\t” 是制表符意思是横向跳到下一个制表符的位置,相当于键盘上的Tab键,“\n”换行相当于endl;
2、在结构中成员默认都是public如不不希望对象直接访问数据成员,可以将数据成员使用private来修饰,即私有的数据成员,必须通过共有的成员函数才能使用,成为数据的封装性,下个小例子看看数据的封装性。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
之所以:
Foo a(10); //语句1 可以,而
Foo b(); 不可以
原因是:
Foo a(100); 等价于 Foo a = Foo(100); 也就是int隐式转化为Foo,然后复制给a(虽然在本质上不能这么理解)
而你所期望的Foo b();用来声明Foo型的变量b,其实是有歧义的。因为你没办法分清楚这一句是声明了一个Foo型的变量还是声明了一个返回值是Foo型的函数。解决办法应该是Foo b(Foo());或Foo b = Foo();本回答被提问者采纳
第2个回答  推荐于2018-03-02
Foo b(); //语句3
去掉括号,
Foo b;
这点与class有差别,没有参数的时候,不需要括号。追问

#include
using namespace std;
struct Foo
{
Foo() { }
Foo(int i) { int j = i; }
void fun(){ }
};
int main(void)
{
Foo a(10); //语句1
a.fun(); //语句2
Foo b(); //语句3
// b.fun(); //语句4 求解释为什么编译出错
return 0;
} 为什么这样就不报错?

追答

这样相当于你定义了一个函数b,其返回值是Foo类型,没有参数。当然不会报错了。

本回答被网友采纳
第3个回答  2011-10-29
因为编译器把吧b()当做一个变量了
所以你只是b是一个没有定义的变量、
所以你要调用时应该是b().fun();
希望对你有多帮助
相似回答