首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

疑义疑问。大大的疑问~

2012-09-04 
疑问疑问。。大大的疑问~~~老师让改错 题目如下:#include iostreamusing namespace stdclass foo{publi

疑问疑问。。大大的疑问~~~
老师让改错= =



题目如下:
#include <iostream>
using namespace std;
class foo{
public:
foo(int n){
str=new char[n];
}
~foo(){
delete str;
}
private:
char *str;
};
int main(){
foo obj;
}




答案如下:
#include <iostream>
using namespace std;
class foo{
public:
foo(int n){
str=new char[n];
}
~foo(){
if(str!=NULL)
delete [] str;
}
private:
char *str;
};
int main(){
#include <iostream>
using namespace std;
class foo{
public:
foo(){}
foo(int n){
str=new char[n];
}
~foo(){
if(str!=NULL)
delete [] str;
}
private:
char *str;
};
int main(){
foo obj[2];
}



我的疑问来了:
1.答案的编译还是报错,原来出在没有声明默认构造函数,可是这是为什么要声明这个东西,平时写也没见都要声明这个
2.为什么是foo obj[2];而不是foo obj(2);这有什么区别么。。
3.是声明了动态不定长数组以后,声明的类对象就都要用中括号【】了么




望解救无知少女。。跪谢orz




[解决办法]
C++里的数组声明和访问都用方括号,语言规定,别问为什么了。
一个类,如果没有定义任何一个构造函数,系统会自动添加一个,这就是为什么别的时候不写也不会报错。
foo类里定义了一个构造函数,则这个类就只有这一个构造函数了(系统不自动添加了),而这时候再定义这个类型的数组就会出错,因为没办法为数组指定无参构造函数之外的构造函数了。
你只要为foo添加一个没有参数的构造函数,或为当前这个添加参数默认值就可以了
[解决办法]

C/C++ code
#include <iostream>using namespace std;class foo{public:    int m;    foo(){m=0;}    foo(int n)    {        m=n;        //str=new char[n];    }    ~foo()    {        //if(str!=NULL)            //delete []str;    }private:    char *str;};int main(){    foo obj1[2]; //申明了一个对象数组,包含2个对象,并调用foo()初始化了,可以看到m=0    cout<< obj1[0].m <<endl;    cout<< obj1[1].m <<endl;    foo obj2(2);    cout<< obj2.m <<endl; //只是申明了一个对象,并调用foo(int n)初始化了,可以看到m=2} 

热点排行