分享

c++类创建对象带括号和不带括号的区别

 青山代码yyf 2024-09-11 发布于广西
本文探讨了在C++中创建对象时,加括号和不加括号的区别。对于有构造函数的类,不加括号的对象可能不会初始化成员变量,而加括号会调用对应的构造函数。对于没有构造函数的类,不加括号的对象成员变量不会初始化,加括号则会被初始化为0。对于内置类型,new后的括号决定是否进行初始化。总结了不同情况下对象创建的行为及其对成员变量的影响。
摘要由CSDN通过智能技术生成

我通过编辑以下程序测试c++创建对象加不加括号的区别,编译器为:g++-4.8.1: 

  1. #include<iostream>
  2. #include<String.h>
  3. using namespace std;
  4. class cat{
  5. private:
  6. char name[10];
  7. int age;
  8. public:
  9. cat(){
  10. cout<<"created no argument"<<endl;
  11. }
  12. cat(const char name[],int age){
  13. memset(this->name,0,sizeof(this->name));
  14. strcpy(this->name,name);
  15. this->age=age;
  16. cout<<"created with arguments"<<endl;
  17. }
  18. void get_info(){
  19. cout<<"name:"<<name<<",age:"<<age<<endl;
  20. }
  21. };
  22. class dog{
  23. private:
  24. char name[10];
  25. int age;
  26. public:
  27. void get_info(){
  28. cout<<"name:"<<name<<",age:"<<age<<endl;
  29. }
  30. };
  31. int main(){
  32. cout<<"creating cats"<<endl;
  33. cat c1;
  34. cat c2();
  35. cat c3("z",3);
  36. cat *pc1=new cat;
  37. cat *pc2=new cat();
  38. cat *pc3=new cat("a",4);
  39. cout<<"creating dogs"<<endl;
  40. dog d1;
  41. dog d2();
  42. dog *pd1=new dog;
  43. dog *pd2=new dog();
  44. int *p1=new int;
  45. int *p2=new int();
  46. int *p3=new int(5);
  47. cout<<"cats info"<<endl;
  48. c1.get_info();
  49. c3.get_info();
  50. pc1->get_info();
  51. pc2->get_info();
  52. pc3->get_info();
  53. cout<<"dogs info"<<endl;
  54. d1.get_info();
  55. pd1->get_info();
  56. pd2->get_info();
  57. cout<<"int"<<endl;
  58. cout<<*p1<<' '<<*p2<<' '<<*p3<<endl;
  59. return 0;
  60. }

运行结果:

通过运行结果可以看到:

有构造函数的猫

c1的name和age成员变量是随机数据,没有得到初始化,

c2没有实际对象的创建,

c3通过定义的构造函数对成员变量进行了初始化,

pc1,pc2同样没有对成员变量进行初始化,

pc3使用定义的构造函数对成员变量进行了初始化。

对于有定义构造函数的类,对象的创建会调用相应的构造函数,类成员变量是否被初始化取决于自己编写的构造函数是否对成员变量进行初始化

pc1调用cat()函数,函数未进行成员变量的初始化,因此pc1的成员变量的值是不确定的,而pc3调用cat(const char name[],int age),该构造函数对成员变量进行了初始化,因此pc3的成员变量值是确定的。

没有构造函数的狗

d1的成员变量没有进行初始化,为随机值,

d2没有被创建,

pd1的成员变量没有进行初始化,为随机值,

pd2的成员变量被初始化为0

对于没有定义构造函数的类,对象的创建会调用默认构造函数。使用类名+对象名创建对象时,不带括号时不会对成员变量初始化,带括号则只是被编译器当成了函数声明。

而使用new+类名的方式创建,不加括号时不会对成员变量初始化,而加括号会初始化为0。

结论:

有构造函数的类:

cat c1;//在栈中创建对象,调用cat()构造函数

cat c2();//被编译器认为是返回值为cat对象的c2()函数声明,因此没有实际对象的创建

cat c3(”z",3);//在栈中创建对象,调用cat(const char name[],int age)构造函数

cat *pc1=new cat;//在堆中创建实例,调用cat()构造函数

cat *pc2=new cat();//在堆中创建实例,调用cat()构造函数

cat *pc3=new cat("a",4);//在堆中创建实例,调用cat(const char name[],int age)构造函数

对于没有构造函数的类:

dog d1;//在栈中创建对象,不进行成员初始化

dog d2();//被编译器认为是返回值为dog 对象的d2()函数声明,没有实际对象的创建

dog *pd1=new dog;//在堆中创建实例,不进行成员初始化

dog *pd2=new dog();//在堆中创建实例,成员初始化为0

额外测试了对于内置类型的情况: 

int *p=new int;//不进行初始化。

int *p=new int();//初始化为0

int *p=new int(4);//初始化为4

参考文章:

C++中new 一个对象的时候加括号和不加括号的区别

C++创建对象加括号和不加括号的区别

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多