C++中的问题

kuankuan_qiao 2013-07-24 05:06:00
1.为什么指针变量只能指向同类型变量(等类似问题) 就比如为什么char *p=(int*)0x12345678就不行呐 还有就是char *p=(char*)0x12345678进行转换 变量地址的转换可以随便转换嘛 或者说char *p;为什么就规定称是一个指向char型的指针,就只能指向一个char型数据呐 既然指针只是指向一个地址就可以了 为什么需要同类型的地址呐
2.为什么父指针可以指向子类对象,而子指针不可以指向父对象(等类似问题) 就比如A是父类,B是子类,为什么A a,*p;B b;a=b;p=&b;就可以呐 就是因为截取数据段取出父类段就正确了 那为什么b=a;不截取,多余的段空出来,不要访问不就行了嘛,而且指针的话,只是赋一个父类地址而已,为什么也不行呐
3.静态数据成员和静态数据成员函数为什么不能进行继承呐 而普通的就可以 如果继承的话也没有什么大的坏处呀
4.为什么在类中定义的成员函数默认定义为内联函数呐 就是因为每次定义在类里面 对象访问的时候 都必须一次次的复制展开代码嘛 要不访问不到的缘故嘛
5.类的数据成员为什么不能使自身类的对象呐 是因为在构造时必须再次构造这个对象而又得构造?
、、、
问题还好多
...全文
184 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuankuan_qiao 2013-07-25
  • 打赏
  • 举报
回复
引用 14 楼 net_assassin 的回复:
回答你的问题: 1 对于不同类型的指针,自身所占大小相同(win32 4字节),没错,如你理解指针只是指向对象的地址罢了, 关键在于不同类型指针不同之处在于所指向的对象不同,具体说所指对象内存结构不同,有大有小。例如 int 和 char 。你可以加强制类型转换,但转换后可能出问题,比如 char * c;int * i; c = (char *)i;再读取c的时候已经不是指向原来的东西,更不是指向原来i所指向的对象了。cast了 2 父类指针指向子类对象,子类指针不可以指向父类对象。截取父类对象赋给子类对象,子类对象的父类部分被实例化了,剩余部分你说空出来,这是逆天的节奏吗?它还是完全意义上的子类或者父类对象吗?是四不像吧 3 静态数据成员和静态函数 可以“继承”,静态类型不属于任何类的对象,父类、子类共享。 4 编译时在代码段展开,还有就是效率问题 5 在实例化的时候,会一直构造下去,直到堆栈溢出的节奏
谢谢您的回复 谢谢
net_assassin 2013-07-25
  • 打赏
  • 举报
回复
回答你的问题: 1 对于不同类型的指针,自身所占大小相同(win32 4字节),没错,如你理解指针只是指向对象的地址罢了, 关键在于不同类型指针不同之处在于所指向的对象不同,具体说所指对象内存结构不同,有大有小。例如 int 和 char 。你可以加强制类型转换,但转换后可能出问题,比如 char * c;int * i; c = (char *)i;再读取c的时候已经不是指向原来的东西,更不是指向原来i所指向的对象了。cast了 2 父类指针指向子类对象,子类指针不可以指向父类对象。截取父类对象赋给子类对象,子类对象的父类部分被实例化了,剩余部分你说空出来,这是逆天的节奏吗?它还是完全意义上的子类或者父类对象吗?是四不像吧 3 静态数据成员和静态函数 可以“继承”,静态类型不属于任何类的对象,父类、子类共享。 4 编译时在代码段展开,还有就是效率问题 5 在实例化的时候,会一直构造下去,直到堆栈溢出的节奏
kuankuan_qiao 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 czarten 的回复:
类型的问题:地址的长度都是一样的,你硬要转换当然也没人拦你,不光是地址,就算变量本身,在内存里都是01串而已,至于它究竟是什么,那是类型决定的,类型告诉计算机把这个01串当做数字解读还是当做字符解读,所以你非要把一串代表float的01串当成int来解读,可以,但没有意义(注意这和强制类型转换是两回事) 另外还涉及到一个问题是,不同类型的内存长度不同,类型告诉计算机给这个变量分配几个字节,以及读取的时候读多少个字节 一个语言会有很多的规定,这些规定说到底都是人为制定的,是为了辅助编程而不是限制编程,很多规定的存在是因为这样规定有好处,而不是因为有逻辑上或硬件上的制约,就像你不能随便改指针的类型,只是因为编译器认为你不应该这么做,而不是计算机真的做不到这件事,这是计算机科学和自然科学的一个很大区别,也是初学者经常绕不过来的地方 以上是我的看法,不过这个问题比较深,期待高手指正
非常感谢您的回复 谢谢 这个问题得好好地想想 谢谢
kuankuan_qiao 2013-07-25
  • 打赏
  • 举报
回复
引用 2 楼 zjq9931 的回复:
试试下一段代码就知道了。 char *p="abc"; int ix=1; int *pi=&ix; printf("%d\n", p); p++; printf("%d\n", p); printf("%d\n", pi); pi++; printf("%d\n", pi);
引用 2 楼 zjq9931 的回复:
试试下一段代码就知道了。 char *p="abc"; int ix=1; int *pi=&ix; printf("%d\n", p); p++; printf("%d\n", p); printf("%d\n", pi); pi++; printf("%d\n", pi);
谢谢您的回复!谢谢!
kuankuan_qiao 2013-07-25
  • 打赏
  • 举报
回复
引用 1 楼 zmlovelx 的回复:
1. char *p=(int*)0x12345678 指鹿为马么 2. 老子能打小子是因为小子是老子生的, 小子打老子会被雷劈的吧
谢谢您的回复!!!谢谢!
Xomic 2013-07-24
  • 打赏
  • 举报
回复
我只想说,我刚刚接触c++那会这几个问题都遇到过,而且当时还特别纠结...慢慢来,渐渐的你就什么都明白了!
bedynamic 2013-07-24
  • 打赏
  • 举报
回复
引用 1 楼 zmlovelx 的回复:
1. char *p=(int*)0x12345678 指鹿为马么 2. 老子能打小子是因为小子是老子生的, 小子打老子会被雷劈的吧
这个回答精辟!!!!!!!!!!! 还有,内联只是为了方便,只有在函数很简单的时候才会用到,如果函数很大用作内联的时候速度就会很慢的,没有效率了,而且内联应该写在头文件中,这样就可以为其它的文件使用了,比较方便。 父类有的子类肯定有,所以可以指向了,而子类包含的父类又没有,而且基类到派生类的转换是不存在的(c++primer p489) 最后一个,肯定是先有类才会有对象嘛,。。。
你怎么了熊吉 2013-07-24
  • 打赏
  • 举报
回复
5.你的解释对的,就是递归构造了,一个类里面包含它本身,本身又包含本身的本身,这个类就无限大了
你怎么了熊吉 2013-07-24
  • 打赏
  • 举报
回复
4.这个没有什么绝对的原因,内联不内联只是效率问题,类的定义里面默认内联是因为……我也说不太上来
你怎么了熊吉 2013-07-24
  • 打赏
  • 举报
回复
静态函数继承: 可以继承的,或者说严格的概念上讲这不叫继承,因为静态函数不属于对象,它属于类,用子类的类名可以访问父类的静态函数,跟用父类的类名访问没有区别
ZongShengLee 2013-07-24
  • 打赏
  • 举报
回复
1、 char *p=(int*)0x12345678 你把它的意思搞错了,对于地址“0x12345678“来说,的确可以将它赋给任何一个指针变量。 但是 char * p = (char *)0x12345678表明你想用char类型来解释”0x12345678"处 的值。 C++是强类型语言,不允许对不同类型之间的变量进行赋值(除非为其定义隐式转换或显式强转) 2、 强转是可以的,没有谁能阻挡你强转 "多余的段空出来,不要访问不就行了嘛",你既然不访问,为什么要转成子类?所以说没有必要么。 3、 静态成员可以继承啊,只不过所有的父类、子类公用这块成员空间而已。 4、 C++ 就是这么规定的。因为总得给类方法一个途径去实现内联,索性就这么内联罢了。 5、 类的成员在类的需要构造函数中构造,在构造之初就需要明确这些成员的大小。所以在自身的 构造函数中,由于正在构建,自身的大小尚不明确。 但是,你若使用自身指针作为成员,由于所有的指针大小固定(4或者8字节),该类的大小也就确定了。
你怎么了熊吉 2013-07-24
  • 打赏
  • 举报
回复
父类子类问题: 很简单,鸟是父类,鸽子是子类 鸽子一定是鸟,但鸟不一定是鸽子 一个捕鸟专用的网,可以用来捕鸽子 但一个捕鸽子专用的网,不能用来捕鸟(谁知道你捕的是麻雀还是鹦鹉) 这个逻辑关系是现实世界很常见的,你可以举出很多类似的例子,理解这一点就够了,不需要从什么截取数据段留出数据段去考虑,因为面向对象的理念就是对现实世界的抽象和模拟,你所说的留出空白字段然后不去访问,不是说计算机做不到,而是有害无益所以C++不这么设计,这又回到上面的问题了
你怎么了熊吉 2013-07-24
  • 打赏
  • 举报
回复
类型的问题:地址的长度都是一样的,你硬要转换当然也没人拦你,不光是地址,就算变量本身,在内存里都是01串而已,至于它究竟是什么,那是类型决定的,类型告诉计算机把这个01串当做数字解读还是当做字符解读,所以你非要把一串代表float的01串当成int来解读,可以,但没有意义(注意这和强制类型转换是两回事) 另外还涉及到一个问题是,不同类型的内存长度不同,类型告诉计算机给这个变量分配几个字节,以及读取的时候读多少个字节 一个语言会有很多的规定,这些规定说到底都是人为制定的,是为了辅助编程而不是限制编程,很多规定的存在是因为这样规定有好处,而不是因为有逻辑上或硬件上的制约,就像你不能随便改指针的类型,只是因为编译器认为你不应该这么做,而不是计算机真的做不到这件事,这是计算机科学和自然科学的一个很大区别,也是初学者经常绕不过来的地方 以上是我的看法,不过这个问题比较深,期待高手指正
  • 打赏
  • 举报
回复
试试下一段代码就知道了。 char *p="abc"; int ix=1; int *pi=&ix; printf("%d\n", p); p++; printf("%d\n", p); printf("%d\n", pi); pi++; printf("%d\n", pi);
帅得不敢出门 2013-07-24
  • 打赏
  • 举报
回复
1. char *p=(int*)0x12345678 指鹿为马么 2. 老子能打小子是因为小子是老子生的, 小子打老子会被雷劈的吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧