新闻  |   论坛  |   博客  |   在线研讨会
C和C++语言学习总结(一)
0750long | 2009-05-19 12:50:51    阅读:908   发布文章

C和C++语言学习总结(一)
知识结构:
1、if,for,switch,goto
2、#define,const
3、文件拷贝的代码,动态生成内存,复合表达式,strcpy,memcpy,sizeof
4、函数参数传递,内存分配方式,内存错误表现,malloc与new区别
5、类重载、隐藏与覆盖区别,extern问题,函数参数的缺省值问题,宏代码与内联函数区别
6、构造和析构的次序,String函数定义
具体实现:
1、if,for,switch,goto
if:
bool int float pointer char变量的使用方法
bool bParam;
int iParam;
float fParam;
int* pParam;
char cParam;
if(bParam) ,if(!bParam);
if(iParam == 0 ),if(iParam != 0 );
if(fParam>= -0.00001 &amp;&amp; fParam <= 0.00001);
if(pParam == NULL),if(pParam != NULL);
if(cParam == '\0'),if(cParam != '\0');
if/else/return的使用方法
if(condition)可以等价为 return (condition?x:y);
{
return x;
}
else
{
return y;
}
for:
执行效率问题:
int row,col,sum;
int a[100][5];
for(row=0;row <100;row++)效率低于 for(col=0;col <5;col++)
{{
for(col=0;col <5;col++) for(row=0;row <100;row++)
{{
sum = sum+a[row][col]; sum = sum+a[row][col];
}}
}}
int i;
for(i=0;i <N;i++)效率低于 if(condition)
{{
if(condition) for(i=0;i <N;i++)
DoSomething(); DoSomething();
else}
DoOtherthing(); else
}{
for(i=0;i <N;i++)
DoOtherthing();
}
for (int x="0";x <=N-1;x++)直观性差于 for (int x="0";x <N;x++)
switch:
switch(variable)
{
case value1: ...
break;
case value2: ...
break;
default: ...
break;
}
switch(c)中的c的数据类型可以是int,char,long,unsigned int,bool.
variable必须是整数或者强制为整数,由于char实际上是ASCII码,所以也可以.
c不可以是double,float,char*.
goto:
goto主要用于
{...
{...
{....
goto error;
}
}
}
error:
...
2、#define,const
#define和const区别
1、#define C语言
const C语言 C++语言
const常量有数据类型,编译器会进行类型安全检查,而#define没有数据类型,
const的常量可以进行调试,但宏常量不能进行调试.
2、const的使用方法
在全局定义 const float PI="3".1415926
在类中定义
class A
{...
A(int size);
const int SIZE;
};
A::A(int size):SIZE(size)
{
...
}
对参数和函数的定义(const只能修饰输入参数,不能修饰输出参数)
const int x="1";表示x的值是1,在程序中不能改变;
const int* x;表示x代表的地址所指向的内容是不能改变得;
int const* x;与const int* x;的表示的意思一样;
int * const x;表示x代表的地址是不能改变的;
当是输入参数时,不需要是void Func(const int i),void Func(const int&amp; i),可以是void Func(int i)
因为输入参数采用"值传递"(const int i),由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰;
不用const int&amp; i的原因在于内部数据类型的参数不存在构造、析构的过程,而复制也非常快,"值传递"和"引用传递"的效率几乎相当.
当是输入参数时,不需要是void Func(const A a),void Func(A a),可以是void Func(A&amp; a)或void Func(const A&amp; a)
不用const A a,A a的原因是函数的效率比较低,因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制和析构过程都需要消耗时间
最好用const A&amp;a的原因是A&amp;a中的a可以被改变,A&amp;a和const A&amp;a的好处在于都不会产生临时对象,效率高;
const A Func(const A&amp;a )const的好处
第一个const表示返回的是个内部产生的对象,它不能被修改
const A Func(...)
{...}
const A a="Func"(...);//不能是A a="Func"(...);
第二个const表示输入的参数是引用传递,函数内部不会产生临时对象,而且这个对象不能被内部修改
第三个const表示此函数内部的所涉及的数据成员不能修改
class Stack
{
int m_num;
int GetCount(void) const;
int Pop(void);
}
int Stack::GetCount(void) const
{
m_num++;//编译错误,企图修改数据成员m_num;
Pop();//编译错误,企图调用非const函数
}
3、文件拷贝的代码
#i nclude <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello World!\n");
FILE* in;
FILE* out;
in=fopen("d:\\1.txt","rb");
out=fopen("d:\\2.txt","wb");
char ch="fgetc"(in);
while(!feof(in))
{
fputc(ch,out);
ch=fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
动态生成内存的代码
------------------------------------------
正确代码:
void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
char* GetMemory2(int num)
{
char* p = (char *)malloc(sizeof(char) * num);
return p;
}
------------------------------------------
错误的代码:
void GetMemory3(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客