1、引用可以是void类型吗?
正确答案: A
A、不可以
B、可以
void类型没有分配内存,而引用必须是另一个固定内存变量的别名,所以不能指向void。引用必须初始化,有类型。
2、请问在64位平台机器下sizeof(string_a),sizeof(string_b)大小分别是()
1.char *string_a=(char *)malloc(100*sizeof(char));
2.char string_b[100];
正确答案: A
A、8 100
B、100 8
C、100 100
D、8 8
数组名不等价于指针,只有数组名作为函数参数时,才退化为指针
string_a是一个char型的指针,在64位系统中sizeof(char*)=8字节
string_b是一个char型的数组,在64位系统中sizeof(char)=1,大小为100*sizeof(char),占100字节。
3、关于以下代码,那个说法正确()
void func()
{
char b[2]={0};
strcpy(b,"aaaa");
}
正确答案: A
A、Debug版崩溃,Release版正常
B、Debug版正常,Release版崩溃
C、Debug版崩溃,Release版崩溃
D、Debug版正常,Release版正常
因为在Debug中有ASSERT断言保护,所以要崩溃,而在Release优化中就会删掉ASSERT,所以会出现正常运行。
但是不推荐如此做,因为这样会覆盖不属于自己的内存,这是搭上了程序崩溃的列车,即未定义行为,出现什么后果都有可能的。
4、下面模板声明中,哪些是非法的()
正确答案: B D
A、template<class Type>class C1{};
B、template<class T, U, class V>class C2{};
C、template<class C1, typename C2>class C3{};
D、template<typename myT, class myT>class C4{};
解释: B选项的U参数没有指定类型, D选项的 2个形参名同名。!!!
函数模板的格式:
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}
类模板的格式为:
template<class 形参名 ,class 形参名,…> class 类名
{ ... };
5、下面说法哪些正确:
正确答案: A B C
A、const int a; // a 是常数
B、int const a; // a 是常数
C、int const *a; // a 指向常数的指针
D、const int *a; // a 是常指针
E、int const *a; // a 是常指针
A,B,const int a; int const a; 这两个写法是等同的,表示a是一个int常量。
C,D,E,const int a; 表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const a;含义相同。
D E都是指向常量的指针,int * const a才是常指针,也叫指针常量!!!!
6、下列关于数组与指针的区别描述正确的是?
正确答案: A B C
A、数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。
B、用运算符sizeof 可以计算出数组的容量(字节数)
C、指针可以随时指向任意类型的内存块。
D、用运算符sizeof 可以计算出指针所指向内容的容量(字节数)
解析:
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。
(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它!!!。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
char a[] = “hello world”;
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是100 字节
}
7、如下代码,result变量的输出结果是多少?
#include<iostream>
using namespace std;
int i=1;
class MyCls{
public:
MyCls():m_nFor(m_nThd),m_nSec(i++),m_nFir(i++),m_nThd(i++){
m_nThd=i;
}
void echo(){
cout<<"result:"<<m_nFir+m_nSec+m_nThd+m_nFor<<endl;
}
private:
int m_nFir;
int m_nSec;
int m_nThd;
int &m_nFor;
};
int main()
{
MyCls oCls;
oCls.echo();
return 0;
}
正确答案: B
A、10
B、11
C、9
D、12
E、8
变量初始化的顺序是其声明的顺序,跟初始化列表中的顺序无关!!!。所以变量的初始化顺序为m_nFir(i++),m_nSec(i++),m_nThd(i++),&m_nFor(m_nThd);(注意m_nFor是m_nThd的一个引用)
i初始值为1,所以经过初始化列表初始化以后m_nFir=1,m_nSec=2,m_nThd=3,m_nFor为m_nThd的一个引用。
并且此时i的值为4,构造函数中执行语句m_nThd=i后,m_nThd=4,m_nFor是它的一个引用,自然值也为4。
输出结果m_nFir+m_nSec+m_nThd+m_nFor=1+2+4+4=11。