return0;
}
//内存的重新解释:
intmain(void)
{
inta=30;
int*p=&a;
intb=reinterpret_cast(p);
cout<
return0;
}
13. 增量表达式和短路表达式?
答:
(1)前增和后增的区别:
前增是先增再赋值,后增是先赋值再增
(2)如果多个表达式用&&进行连接,则一个表达式为假则真个表达式为假。
(3)如果多个表达式用||进行连接,则一个表达式为真,则真个表达式为真
第二部分:
c++中的函数,程序结构。
作者:
魏华超 联系方式:
weihuachao@
1. 什么是函数原型?
答:
(1)函数原型是一条程序语句,它以分号结束。
它有函数的返回类型,函数名和参数列表组成。
(2)参数表包含所有参数的数据类型,参数之间用逗号分开。
C++中,函数的声明就是函数的原型。
(3)标准库函数的声明都在头文件中提供。
(4)函数原型和函数的定义必须在返回类型,函数名字和参数表上保持一致。
2. 全局变量和局部变量和静态变量的使用?
答:
(1)一个程序将操作系统分配其运行的内存块分成4个区域:
a. 代码区,存放程序的代码,即程序中的各个函数的代码块。
b. 全局数据区,存放程序的全局数据和静态数据。
c. 堆区,存放程序的动态数据。
d. 栈区,存放程序的各个数据,函数中的变量
(2)在函数的外部定义的变量是全局变量。
全局变量有编译器建立,并且初始化为0。
该变量存放在全局数据区。
该变量的作用域在整个应用程序内有效。
如果调用不同源文件内的变量或者函数使用extern关键字。
Extern关键字仅是声明,不时变量的定义。
(3)在函数内部定义的变量是局部变量。
作用域函数的内部,生命的周期是函数的调用期间。
该变量存放在栈区。
(4)在局部变量的前面加上static关键字,就成了局部静态变量。
局部静态便领存放在内存的全局数据区。
作用域在函数的内部,生命周期整个应用程序。
(5)在全局变量的前面加上static关键字,是全局静态变量。
存放在全局数据区。
作用域在当前文件有效,生命周期整个应用程序。
(6)在函数的前面加上static关键字,则该函数只在当前文件内有效。
3. 什么是递归函数?
答:
递归函数是自调用函数,在函数内部直接或者间接的调用自己。
4. 什么是内联函数?
如何使用内联函数?
答:
(1)内联函数也称做内嵌函数,它主要是解决程序的运行效率。
(2)内联函数避免了函数的开栈和参数传递等时间,而是调用的时候进行代码的替换,提高程序的效率。
(3)在函数的声明的时候加上inline关键字便可以使函数成为内联函数。
(4)内联函数的定义应该放在头文件内。
5. 内联函数的函数体有哪些限制?
答:
(1)内联函数不能有复杂的控制语句,如for,switch和while。
(2)递归函数不能是内联函数。
(3)存在以上情况,编译器把内联函数当作普通的函数对待。
6. 什么是重载函数?
答:
(1)出现在相同作用域中的函数,具有相同的名字而行参表不同,则称为重载函数。
(2)重载函数必须在参数的类型,参数的个数和参数的顺序上不同,只有返回值的不同不能产生重载。
(3)不能用typedef定义的类型名来区分重载函数声明中的参数。
7. 重载函数的匹配顺序是什么?
答:
(1)寻找一个严格的匹配,如果找到了,就用那个函数。
(2)通过内部转换寻求一个匹配,如果找到了就用那个函数。
(3)通过用户自定义的转换,如果找到了,就用那个函数。
8. 什么是默认参数?
答:
(1)在函数的声明或者定义时对参数给定默认值的参数成为默认参数。
(2)函数的声明中如果提供了默认值,则函数的定义不允许默认值。
9. 默认参数的顺序规定?
答:
(1)函数的定义时默认值的顺序应该从右到左逐渐定义。
如果参数列表中的一个参数给定了默认值,则后边的所有的参数都必须给定默认值。
(2)函数的调用时,参数的顺序只能从左到右匹配。
10. c++中有哪些不同的作用域和声明周期?
答:
(1)c++中的作用域有:
局部作用域,函数作用域,文件作用域,函数原型作用域。
(2)c++中的生命周期有:
静态生命期,局部生命周期,动态生命周期。
11. 如何使用c++中的多文件结构?
答:
#ifndef_FILE_NAME
#define_FILE_NAME
#endif
12. 函数指针的概念和作用?
答:
(1)函数指针是指向函数而非指向对象的指针。
函数指针的类型由返回类型和行参表来确定,和函数的名称没有关系。
(2)可以使用typedef简化函数指针的定义。
例:
利用函数指针对不同的成员变量进行排序。
structStu
{
stringname;
intage;
};
boolcompareByName(Stu s1,Stus2)
{
return(s1.name>s2.name);
}
boolcompareByAge(Stus1,Stus2)
{
return(s1.age>s2.age);
}
voidsort(Stu*begin,Stu*end,bool(*com)(Stus1,Stus2))
{
Stutemp;
for(inti=0;i {
for(intj=0;j {
if(com(begin[j],begin[j+1]))
{
temp=begin[j+1];
begin[j+1]=begin[j];
begin[j]=temp;
}
}
}
}
intmain(void)
{
Stustu[5];
stu[0].name="rose";
stu[0].age=20;
stu[1].name="jack";
stu[1].age=60;
stu[2].name="lucy";
stu[2].age=23;
stu[3].name="tom";
stu[3].age=70;
stu[4].name="chal";
stu[4].age=24;
sort(stu,stu+5,compareByAge);
for(inti=0;i<5;i++)
{
cout<<"nameis:
"<"< }
return0;
}
13. 如何使用c++中的动态链接库?
第三部分:
数组,指针,堆分配
作者:
魏华超 联系方式weihuachao@
1. 数组如何定义?
数组的遍历和初始化?
答:
(1)数组是相同的数据类型在内存中连续存储的集合。
(2)数组的定义:
类型说明符 数组名【常量表达式】
(3)数组的名字代表数组的首元素的地址。
(4)因为连续存储,数组的遍历可以使用下标的索引也可以使用首地址加偏移量。
2. 数组作为函数的参数的传递方式是什么?
答:
数组做为函数的参数按地址进行传递。
3. 数组作为函数的参数应该注意什么?
答:
(1)数组做为函数的参数,不对下标做检查,因此为了对边界的正确引用,有两种解决方案。
(2)标准库的规范。
传递指向数组的首地址和最后一个元素的下一个位置的指针。
数组中,数组的前一个位置是非法的,数组的后一个位置是合法的。
例:
voidprintValue(constint*begin,constint*end)
{
While(begin!
=end)
Cout<<*begin++<}
(3)c规范和标准c++前的规范:
数组作为函数的参数传递两个参数,一个数组的首地址,一个数组的大小。
4. 什么是vector?
答:
(1)vector是标准库的类型,是同一种类型的集合,每个对象都有对应的整数的索引值。
vector和string一样,可以管理自身的内存,因此vector称作容器。
(2)vector是模版机制,因此定义需要指定存储的类型。
5. vector的定义和遍历初始化?
答:
(1)vector定义的几种方式。
a. vectorv1; v1空的容器。
b. vectorv2(v1); v2是v1的一个副本
c. vectorv3(n,i) n个为i的值
d. vectorv4(n) n个元素。
e. vectorv5(begin,end) 主要是数组元素的拷贝
6. vector对象的操作:
(1)v.empty():
如果V为空,返回true,否则返回false;
v.size() 返回V元素的个数。
v.push_back(t) 在V的末尾添加一个t的元素。
V[n] 返回v中小标为n的元素。
V1=v2 v1的元素替换为v2元素副本。
V1==v2 v1和v2比较,判断是否相等。
(2)利用下标访问元素,但下标不能向容器添加元素。
(3)下标只能修改已经存在的元素或者访问已经存在的元素。
7. 什么是迭代器?
如何使用?
答:
(1)除了下标访问vector外,标准库提供了一种新的访问数据元素的方法:
iterator.迭代器是一种检查容器内元素并遍历容器内元素的的数据类型。
(2)标准库为每种容器都提供了iterator操作。
(3)iterator使用begin()和end()方式遍历元素:
begin()返回容器首元素的地址。
End()返回末元素的下一个地址。
(4)const_iterator该类型只能读取元素内的数据,不可以进行修改。
8. 如何使用vector作为函数的参数?
答:
(1)传递容器的两个地址:
(2)传递vector的引用或者指针。
9. 指针的作用?
举例讲述?
答:
(1)间接改变变量的值
(2)提高程序的效率。
10. 指针如何定义?
答:
(1)数据类型 *指针变量名。
(2)用&操作符取变量的地址。
(3)用*间接引用指针。
(4)指针只有在指向合法而且有效的内存空间下才可以使用。
11. 指针变量作为函数的参数?
指针作为函数的返回值
intcompare(constchar*str1,constchar*str2)
{
for(;*str1==*str2;str1++,str2++)
{
if(*str1=='\0')
{
return0;
}
}
return(*str1-*str2);
}
char*strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!
='\0'); //[4]strDest不能改为strDestCopy
return strDestCopy;
}
12. new和delete如何正确的使用?
答:
(1)new与delete是C++语言特有的运算符,用于动态分配和释放内存。
(2)new用于为各种数据类型分配内存,并把分配到的内存首地址赋给相应的指针。
new的功能类似于malloc()函数。
使用new的格式为:
<指针变量>new<数据类型>;
其中,<数据类型>可以是基本数据类型,也可以是由基本类型派生出来的类型;<指针变量>取得分配到的内存首地址。
(3) new有3种使用形式。
a .给单个对象申请分配内存
int*ip;
ip=newint;//ip指向1个未初始化的int型对象
该代码段首先定义了一个指向整型对象的指针,然后为该对象申请内存空间,如果申请成功,则ip指向一个int型对象的首地址。
b. 给单个对象申请分配内存的同时初始化该对象
int*ip;
ip=newint(68);//ip指向1个表示为68的int型对象
该代码段首先定义了一个指向整型对象的指针,然后为该对象申请内存空间,如果申请成功,则ip指向一个int型对象的首地址,并将该地址的内容初始化为68。
C .同时给多个对象申请分配内存
int*ip;
ip=newint[5];//ip指向5个未初始化的int型对象的首地址
for(inti=0;i<5;i++)
ip[i]=5*i+1;//给ip指向的5个对象赋值
该代码段首先定义了一个指向整型对象的指针,然后为5个int型对