:|Dx=2# 发表于 2020-10-24 13:42:51

C++小白在线求助

#include <iostream>
using namespace std;

class Student {
    public:
      int age;
      string name;
};

int main(void)
{
      Student s; //这创建了对象了吗,还是仅仅是声明?
      Student s = new Student(); // 在heap上创建对象
}

这两种创建对象的区别?
顺便有熟悉Java的人的话

SomeClass sc;
s.somemethod();
s.someproperity;

会显示 “对象未初始化”,一般IDE会补上NULL
SomeClass sc = null;
然后调用的话则是空指针错误。

SomeClass sc;
为啥在C++里面就可以直接调用对象的属性和方法呢?有啥区别呢,不都是在stack上创建符号表的吗?

:|Dx=2# 发表于 2020-10-24 13:46:12

Person p = new Person(); // Java写法
Person *p = new Person(); //C语言写法
----------------------------------------------------
看上去只是多了一个星号,可以把java这里的p理解为C++的指针吗?还是引用呢?
Person p; //Java:declare一个对象变量,但是没有初始化(new)
Person p; // C++:declare and initialize???(如果这句话是对的,那C++调用的是哪里的构造函数呢)

:|Dx=2# 发表于 2020-10-24 13:47:12

Demo d;
d.cfunction();

为啥C++允许这种写法?在Java中这种写法不是 “对象未初始化” 错误吗?

:|Dx=2# 发表于 2020-10-24 13:49:13

Demo d; // does this statement means "declare" and "initialize"?

乐乐学编程 发表于 2020-10-24 15:19:49

先声明,我不懂C++,我用VC++6.0编译你的程序,有如下报错,与第13行有重定义,并且不是同一个类型。你自己再检查:

第14行:
1、: error C2086: 's' : redefinition
2、error C2440: 'initializing' : cannot convert from'class Student * 'to'class Student'

:|Dx=2# 发表于 2020-10-24 15:46:49

乐乐学编程 发表于 2020-10-24 15:19
先声明,我不懂C++,我用VC++6.0编译你的程序,有如下报错,与第13行有重定义,并且不是同一个类型。你自己 ...

你说的13行是哪一行?

:|Dx=2# 发表于 2020-10-24 15:47:28

乐乐学编程 发表于 2020-10-24 15:19
先声明,我不懂C++,我用VC++6.0编译你的程序,有如下报错,与第13行有重定义,并且不是同一个类型。你自己 ...

阁下今年几岁了

乐乐学编程 发表于 2020-10-24 15:53:04

:|Dx=2# 发表于 2020-10-24 15:47
阁下今年几岁了

问答个问题,还要问几岁?

乐乐学编程 发表于 2020-10-24 15:53:42

本帖最后由 乐乐学编程 于 2020-10-24 15:54 编辑

:|Dx=2# 发表于 2020-10-24 15:46
你说的13行是哪一行?

13行定义了一次,14行再次定义,且类型不同

#include <iostream>
using namespace std;

class Student {
    public:
    int age;
    string name;
};

int main(void)
{
   Student s; //这创建了对象了吗,还是仅仅是声明?
   Student s = new Student(); // 在heap上创建对象
}

:|Dx=2# 发表于 2020-10-24 16:14:28

乐乐学编程 发表于 2020-10-24 15:53
问答个问题,还要问几岁?

我猜你不超过12岁

:|Dx=2# 发表于 2020-10-24 16:16:10

乐乐学编程 发表于 2020-10-24 15:53
13行定义了一次,14行再次定义,且类型不同

不是的,额好吧
上面这条 Student s; // 这是C++
Student s = new Student(); // 这是Java

如果是C++,那也是Student *s = new Student(); // 因为返回的值对象指针呢

乐乐学编程 发表于 2020-10-25 08:48:12

:|Dx=2# 发表于 2020-10-24 16:14
我猜你不超过12岁

不要乱猜人家的年龄嘛,好想你给个最佳答案哟~~

yuxijian2020 发表于 2020-10-25 12:18:31

本帖最后由 yuxijian2020 于 2020-10-25 13:06 编辑

我看没人回答c++,我来试试吧
首先Student s; //确实创建了1个Student对象,但是并没有初始化,所有没有调用任何构造函数,这里确实只是一个声明                <-- 这里错误,是我胡扯,参考 @大神本人 回答,sorry 这里误导了
其次Student s = new Student(); //这里重新定义了1个对象s(不是指针),想要做new操作并调用构造函数,但是s的类型为Student,new返回的是Student*,这里任何编译器都会报错
再然后如果Student* s = new Student();//这是正确的创建指向Student类型的对象指针,并且通过new成功调用Student()默认构造函数初始化,但是默认构造函数并没有重写,用的是编译器自动生成的默认构造函数,所以还是什么事情都没干
再回答Student s;和Student* s = new Student();的区别
第一个是在栈上创建一个Student类的对象s
后者则是在堆上申请一块40个字节(这里不只40个字节,还有一些因为申请空间造成的额外开销)大小的内存空间(sizeof(Student) = 40(int占4个字节,string占32个字节))
该空间存放一个Student类型的对象,但是因为你调用的默认构造函数什么都没干,所以这块内存空间还没有被初始化
这里你去查看age的值和name的值应该是一串无意义的符号(可能为0,可能不为0)

yuxijian2020 发表于 2020-10-25 12:31:06

SomeClass sc;
s.somemethod();
s.someproperity;

会显示 “对象未初始化”,一般IDE会补上NULL
SomeClass sc = null;
然后调用的话则是空指针错误。

SomeClass sc;
为啥在C++里面就可以直接调用对象的属性和方法呢?有啥区别呢,不都是在stack上创建符号表的吗?

刚刚忘记回答你这个问题了
Java我也只懂一点语法,我就不说了
c++可以直接调用对象的属性和方法这个问题
因为你已经创建了一个对象或对象指针
而且你以public定义的属性
所以既然有对象(或对象指针)就可以访问该对象内的public部分的内存
但是如果该对象(或对象指针)的内存没有被初始化
直接使用该对象(或对象指针)内部的属性可能会出现不可预料的结果
c++的高效就是因为需要你自己去管理内存
这种操作可能会导致程序的不稳定或者崩溃,内存泄漏
但是也会让你的程序比别的语言运行的更快

大神本人 发表于 2020-10-25 12:39:00

yuxijian2020 发表于 2020-10-25 12:18
我看没人回答c++,我来试试吧
首先Student s; //确实创建了1个Student对象,但是并没有初始化,所有没有调用 ...

我看你就在胡扯

大神本人 发表于 2020-10-25 12:40:20

楼主不要急,自己做个实验很容易就明白了

Student s; // 调用默认无参数构造函数
Student k = s; // 调用默认拷贝构造函数

yuxijian2020 发表于 2020-10-25 13:07:34

大神本人 发表于 2020-10-25 12:39
我看你就在胡扯

这里是我错了,已改正,请指教其他的我说的还有错误吗?

大神本人 发表于 2020-10-25 14:08:26

yuxijian2020 发表于 2020-10-25 13:07
这里是我错了,已改正,请指教其他的我说的还有错误吗?

太多啦,我都懒得和你说

405794672 发表于 2020-10-25 19:25:05

你这问题也太多了。。
Java忘记了。不过有一件事是不能忘的:
那就是,Java不能带着指针飞
也就是说,你直接把别人房子拖走是不行的,在C里可以任你翱翔。
Student s是直接分出了一块地,装了个东西进去,就是说在名字为s的地上装了一个叫Student的东西进去
这和int s是一样的道理
Student s= new Student();是这样吗?我写得少,一般写的没有后面那个括号,而且前面带个*号
定义的时候带星号,表示s这个名字里面只能是地址
就是说分出一块地来,名字叫s,但s只能存一个地址。也就是说这个地很小,只有4字节,地址专用
当CPU拿出s里面的东西时,不是直接用,而是看它是什么门牌号码,作为门牌号,到对应的地址去中找东西
,那个东西才是真正要用的。

Java 不允许你操作地址,那么自然没有星号。那么很有可能是直接定了一个值,整个东西都拿来了
后面那个new Person是指创建一个Person,这个和int,创建了,但不同的是:
这个创建了没名字。如果创建的时候不赋给一个变量,就是名字,虽然它创建了,存在了,但你没有任何办法去访问它。除非你把整个内存全部栈出来!然后仔细一个个地找。
这个有什么用呢?它是一个类,和函数用法一样,它是可以在使用过程中选择的。
像int之类的,一定义,立马创建了,但加个new,也就是new int,可以判断用户选择,然后决定是否创建。
如果你硬要杠,要判断后,直接用int,那当我没说,说起来就更多了,说不完了。。
页: [1]
查看完整版本: C++小白在线求助