疑问疑问。。大大的疑问~~~
老师让改错= =
题目如下:
#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}