看了 CSDN VC编程经验总结基础篇后的几点疑问(100分)!

lingzantia 2005-05-08 09:47:27
期盼高手解答,最好能给出实例,菜鸟感激不尽!



1、用sizeof计算变量的空间,如果是数组,按实际空间返回;常量字符串(实际上是在静态内存区开辟

的变量)sizeof返回比实际长度加一。如果是指针则不考虑它指向的空间大小,仅仅返回指针类型的大小

。如果用sizeof计算函数的行参,即使是属组也仅仅返回一个相关类型指针的大小。



2、用const定义的int可用来开辟数组,但const定义的常量数组中的元素,不能用来定义数组。



3、 类中的常量const 类型的,不能在类中被用来定义数组。而enum {ONE=100; TWO=2};定义的ONE、TWO

却可以。通常的enum定义的置分配问题:enum A{ L=9, Z};此时Z的值为10。



4、如果用sizeof计算函数的行参,即使是属组也仅仅返回一个相关类型指针的大小。



5、c和c++编译器,对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用

extern “C”告诉编译器,它是c的函数,按c的规则编译。通常我们使用的标准头文件已被处理过。



6、第二次定义一个已存在的static变量,对变量的内容无影响,但它的可见范围只在定义的范围内。



7、重载函数的时候也可以使用const,考虑下面的代码:
class MyClass
{
char *str ="Hello, World";
MyClass()
{
//void constructor
}

~MyClass()
{
//destructor
}
char ValueAt(int pos) const //const method is an accessor method
{
if(pos >= 12)
return 0;
return str[pos]; //return the value at position pos
}

char& ValueAt(int pos) //通过返回引用设置内存内容
{
if(pos >= 12)
return NULL;
return str[pos];
}

};



在上面的例子中,ValueAt是被重载的。Const实际上是函数参数的一部分,在第一个成员函数中它限制这

个函数不能改变对象的数据,而第二个则没有。这个例子只是用来说明const可以用来重载函数,没有什

么实用意义。
那么在什么情况下调用char ValueAt(int pos) const,什么时候调用char& ValueAt(int pos)呢?

...全文
303 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
tudou614 2005-05-10
  • 打赏
  • 举报
回复
sizeof不是函数,是C++的一种操作符
du51 2005-05-09
  • 打赏
  • 举报
回复
4.
在我上面加注释的地方.参数的时候,退化为指什,一般返回4.
du51 2005-05-09
  • 打赏
  • 举报
回复
1
#include<iostream>
using namespace std;
int main()
{
char aa[10];
cout<<sizeof(aa)<<endl; //此处以参数传的时候,退为指针.
char a[]="1234567890";
cout<<sizeof(a)<<endl;
char *p="1234567890";
cout<<sizeof(p)<<endl;
system("PAUSE");
return 0;
}
heroboy2000 2005-05-09
  • 打赏
  • 举报
回复
MyClass a,b;
MyClass *pa=&a;
const MyClass *pb=&b;
MyClass const *pb2=&b;
MyClass& ra=a;
const MyClass& rb=b;

对于a,b,pa,ra,pb2调用ValueAt(int pos);
对于pb,rb调用ValueAt(int pos) const;
oyljerry 2005-05-09
  • 打赏
  • 举报
回复
5,就是用来兼容C,从而在C++中可以调用
因为c,c++的函数调用约定不一样,函数命名规则也不同
积木 2005-05-09
  • 打赏
  • 举报
回复
5、c和c++编译器,对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用
extern “C”告诉编译器,它是c的函数,按c的规则编译。通常我们使用的标准头文件已被处理过。

这句话应该比较明白了吧,也就是说如果有特殊要求你需要用C的风格来编译代码,那么你就用
extern "C"
{
......
}这句话,
上面说标准头文件都经过处理,是指头文件里面一般都有这样的宏定义
就是判断你使用的编译器是C还是C++
#ifdef __cplusplus//如果使用C++编译器,就按照C风格来编译代码。
extern "C" {
#endif

........

#ifdef __cplusplus
}
#endif
这样做的目的无非是最大限度的重用以前的C代码,毕竟C++太多地考虑了兼容C语言代码这个问题。

6、第二次定义一个已存在的static变量,对变量的内容无影响,但它的可见范围只在定义的范围内。

就是说变量的作用域么

static int i;//在全局可见
void fun(void)
{
static int i;//只在函数范围内可见,如果你在这里直接引用i,得到的值只是在函数内定义的i;
}
前几个问题表述好晦涩,不知所云。
lingzantia 2005-05-09
  • 打赏
  • 举报
回复
多谢各位热心的朋友了,你们的回答给了我很大的帮助,还有2 3 5 6 题没人解答,期待!!
dudongxiao 2005-05-09
  • 打赏
  • 举报
回复
你这个程序本身有很多问题,在此暂且不谈,只回答你提的问题。
函数申明后面加const的作用有2:
1。保证该函数无法对该类的成员数据进行修改。
2。控制反问域。也就是说加了const的函数,无论是变量对象还是常量对象都可以调用;而没加const的函数,就不能被常量对象所访问了。
你这里用const进行重载,这样的话,变量对象调用没加const的函数;常量对象调用加了const的函数
guyaguya 2005-05-09
  • 打赏
  • 举报
回复
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<=sizeof(str)/sizeof(str[0]); ++i )///<attension2
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}

Int main()
{
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl; ///< attension1 UpperCase( str );
cout << str << endl;
}

在main函数中我标记的attension1处sizeof(str)为6,即字符串的长度+1;
但是str作为参数传递的时候,str就蜕变成指针传递,我标记的attension2处sizeof(str)为4,即指针的大小

brucelee0224 2005-05-09
  • 打赏
  • 举报
回复
up
du51 2005-05-09
  • 打赏
  • 举报
回复
这贴子,看见的太晚了已经结了.如果,楼上两位能看到的话.我们站内短信联系.但是,真的请不要说的那么严重.我实在想不通,两位能把sizeof当成参数.能这样想.也算高人了.相信不会害人.
du51 2005-05-09
  • 打赏
  • 举报
回复
算了.还有楼上说我害人的................晕.
请不要乱叫.
还是那句话,只要不傻应该都知道不是把sizeof传的.你看不懂我的注释的意思吗?
你要钻牛角尖的话,你怎么不把cout当成传的参数呀..........
真的无语.
du51 2005-05-09
  • 打赏
  • 举报
回复
晕.一直没再看这个贴子.没想到一片骂声.
to cunsh(找工作)
我简单不知道你什么意思?我的程序是我机器上通过的.三个sizeof是楼主1题所说到的三种情况.应作者的意思写一个程序表示用的.
"以参数传的时候,退为指针. "是对的.可是这个sizeof不是函数的啊.
这句话,也没听懂是什么意思?
sizeof 我相信只要不傻都知道的.是C的的一函数.对吧.我不明白你的不是函数的呀.是什么意思.请解释一下.




lingzantia 2005-05-09
  • 打赏
  • 举报
回复
多谢各位朋友了,结贴!
dzw2004 2005-05-09
  • 打赏
  • 举报
回复
up~
heroboy2000 2005-05-09
  • 打赏
  • 举报
回复
问题2,3:
需要搞清楚,编译时常量和运行时常量。只有编译时常量能作为数组的大小。
2:const int a[]={1,2,3,4,5};
由于 存在 a[0],a[1]这样的访问,所以a必须放在内存中,不是编译时常量。
3:
class A
{
const int size;
static const int size2=100;
int array[size2];//这是可以的
public:
A(int s):size(s)//size是运行时常量,只有在运行时才能决定它的大小
{}

}
e.g.
int i;
cin>>i;
A a(i);
zhouhuahai 2005-05-09
  • 打赏
  • 举报
回复
to--> du51(郁郁思扬) :

char aa[10];
cout<<sizeof(aa)<<endl; //此处以参数传的时候,退为指针.
小心害死人!!
只是在用其它函数时,传递参数时数组才会退为指针!!!!
至于sizeof()本身就是用来计算大小的,你可以把库找出来看看就知道了,它本身不存在退化的问题。
lingzantia 2005-05-09
  • 打赏
  • 举报
回复
这个我已经明白,但是应该怎么计算形参的sizeof呢?
cunsh 2005-05-09
  • 打赏
  • 举报
回复
"以参数传的时候,退为指针. "是对的.可是这个sizeof不是函数的啊.
cunsh 2005-05-09
  • 打赏
  • 举报
回复
回复人: du51(郁郁思扬) ( ) 信誉:100 2005-05-09 00:32:00 得分: 0


1
#include<iostream>
using namespace std;
int main()
{
char aa[10];
cout<<sizeof(aa)<<endl; //此处以参数传的时候,退为指针.
char a[]="1234567890";
cout<<sizeof(a)<<endl;
char *p="1234567890";
cout<<sizeof(p)<<endl;
system("PAUSE");
return 0;
}
4.
在我上面加注释的地方.参数的时候,退化为指什,一般返回4.

==============================
请先试一试再贴.

加载更多回复(6)

64,642

社区成员

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

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