如果定义构造函数,为什么必须使用指针? 当我为我的类创建构造函数时,C++强迫我做两件事: 在我使用new关键字时,将rect定义为指针 当我将它定义为指针时,我需要使用->而不是来访问它们的属性和方法

如果定义构造函数,为什么必须使用指针? 当我为我的类创建构造函数时,C++强迫我做两件事: 在我使用new关键字时,将rect定义为指针 当我将它定义为指针时,我需要使用->而不是来访问它们的属性和方法,c++,class,C++,Class,我的问题是,为什么会这样?我来自Java背景,在Java中不是这样的,所以我想这里有一个我看不到的优势。有人能帮我澄清一下吗?我为这个新手问题道歉 带构造函数 //类示例 #包括 使用名称空间std; 类矩形{ int宽度、高度; 公众: void set_值(int,int); int area(){返回宽度*高度;} 矩形(整数w,整数h){ 宽度=w; 高度=h; } }; int main(){ 矩形*rect=新矩形(5,8); CUT< P>用于访问类成员的符号,C++和java之间

我的问题是,为什么会这样?我来自Java背景,在Java中不是这样的,所以我想这里有一个我看不到的优势。有人能帮我澄清一下吗?我为这个新手问题道歉

带构造函数
//类示例
#包括
使用名称空间std;
类矩形{
int宽度、高度;
公众:
void set_值(int,int);
int area(){返回宽度*高度;}
矩形(整数w,整数h){
宽度=w;
高度=h;
}
};
int main(){
矩形*rect=新矩形(5,8);

CUT< P>用于访问类成员的符号,C++和java之间有一些相似之处:

<> > C++ > Ac>b>代码>通常等同于代码>(*a).b/COD>。通常我说,因为C++中可能有可能将指针加到成员运算符<代码> >代码>,而不可能超载<代码> .<代码>(尽管C++标准委员会有一些动作可以放松)。 <>对于类实例的创建,C++中出现了复杂性,因为与java不同,您基本上有两种选择,涉及类(和普通的旧数据)类型实例化。
  • 自动存储持续时间:
    矩形rect(1,2);

  • 动态存储持续时间:
    Rectangle*rect=新矩形(1,2);

  • (其他两种选择——
    static
    thread\u local
    更具第一味道。)


    <>注意,在C++中,与java不同,你需要调用<代码>删除<代码>来释放与C++相关联的内存。在管理内存方面有很大帮助。

    < P>在访问类成员的符号中,C++和java之间有一些相似之处:

    <> > C++ > Ac>b>代码>通常等同于代码>(*a).b/COD>。通常我说,因为C++中可能有可能将指针加到成员运算符<代码> >代码>,而不可能超载<代码> .<代码>(尽管C++标准委员会有一些动作可以放松)。 <>对于类实例的创建,C++中出现了复杂性,因为与java不同,您基本上有两种选择,涉及类(和普通的旧数据)类型实例化。
  • 自动存储持续时间:
    矩形rect(1,2);

  • 动态存储持续时间:
    Rectangle*rect=新矩形(1,2);

  • (其他两种选择——
    static
    thread\u local
    更具第一味道。)


    <>注意,在C++中,与java不同,你需要调用<代码>删除<代码>来释放与C++相关联的内存。在管理内存方面有很大帮助。

    你不必仅仅因为类中有构造函数就使用指针。这两件事是不相关的

    你的例子

    Rectangle* rect = new Rectangle(5,8);
    
    无需指针即可轻松重写:

    Rectangle rect(5,8);
    

    还要注意,
    Rectangle;
    仍然调用构造函数:默认构造函数(不带参数),
    Rectangle::Rectangle()
    。如果您不自己定义构造函数,编译器将为您生成默认构造函数。

    您不必仅仅因为类中有构造函数就使用指针。这两件事是不相关的

    你的例子

    Rectangle* rect = new Rectangle(5,8);
    
    无需指针即可轻松重写:

    Rectangle rect(5,8);
    
    还请注意,
    Rectangle rect;
    仍然调用构造函数:默认构造函数(不带参数),
    Rectangle::Rectangle()
    。如果您不自己定义构造函数,编译器将为您生成默认构造函数。

    主要区别(无论如何,这在这里很重要)java与C++之间是内存管理。

    到第一个近似,java中的所有东西都是堆上分配的对象,并且通过引用访问这些对象(尽管它们更像C++指针而不是C++引用,有时你可以很好地看到它们称为指针)。。例外情况是int之类的基本类型,这就是为什么您不能创建

    ArrayList
    。系统使用垃圾收集为您管理对象的生存期;当没有任何内容包含对对象的引用时,它将被收集

    C++提供了更多的选择。一种选择是,可以通过指针使用指针分配新的对象,并使用指针来访问这些对象。到目前为止,这与java完全相同,这可能是java借用了<代码>新< /Cord>关键字的原因。这里的主要区别在于C++没有跟踪LIFET。这些对象的ime;当您希望销毁对象时,必须手动使用

    delete
    关键字

    或者,您可以在堆栈上进行分配,如下所示:

    int main () {
      Rectangle rect(5,8);
    
      cout << "area: " << rect.area();
      return 0;
    }
    
    int main(){
    矩形矩形矩形(5,8);
    cout
    运算符,因为它们通过指针(C++)或引用(Java)访问其他位置对象的字段。如果您尝试在空指针上使用
    ->
    ,或在空Java引用上使用
    ,它们实际上可以以类似的方式爆炸

    C++ >代码> ./Cux>操作符访问值字段。它做了不同的事情,这就是为什么不同。

    < P> java和C++之间的主要区别(在这里很重要)是内存管理。< /P> 第一种近似情况是,在Java中,一切都是在堆上分配的对象,您可以通过reference访问这些对象