为什么C new没有返回指向它创建的对象的指针?

我理解下面的代码,根据我的知识,当我使用new声明一个对象时,它构造一个特定类型的对象并返回指向该对象的指针.但是当我使用new创建一个student对象时,它不会返回指向该对象的指针.此外,当我打电话给新学生时(s1),“学生(学生*)”被称为“学生(学生)”,而不是给出错误,例如没有从学生到学生的类型转换*

#include <bits/stdc++.h>

using namespace std;

class student {
    public:
        int cool;

        student(student* s){ // this constructor is taking pointer to s whereas i am calling it by value below
            this->cool=s->cool;
        }
        student(){
            this->cool=1;
        }
};
void blah(student s){
    printf("cool:%d\n",s.cool);
}

int main(){

    student s1=new student(); // here new is not returning student*
    s1.cool=2;
    student s2=new student(s1); // here we are passing s1 which of type student but constructor (student*) is called why ???
    blah(s2);
}

以下输出我得到没有任何错误:

cool:2

最佳答案
你在泄漏记忆.

这个构造函数:

student(student* s)

用于隐式地满足转换,因为它未标记为显式.那么这里发生了什么:

student s1=new student();

是你堆分配一个新的学生对象.新表达式求值为指针.当编译器查看赋值时,它知道赋值将不起作用,因为s1是学生,并且您正在为其分配学生*.所以它寻找一种方法来转换它并找到我上面提到的构造函数.

所以你所做的相当于:

student s1 = student(new student());

由于您从不删除指针,因此堆分配被泄露,但从您的角度来看,您的程序正确执行.

如果您将转换构造函数标记如下:

explicit student(student* s)

然后编译器不会自动使用此构造函数进行转换,需要显式调用某种类型,并且行student s1 = new student();确实会导致编译时错误,同时允许学生s1 =学生(新学生());工作(但当然它仍会导致内存泄漏).

转载注明原文:为什么C new没有返回指向它创建的对象的指针? - 代码日志