选择题
解析:内联函数(
inline
)一般用于代码较少,代码块里面没有递归且频繁调用的函数,是一种以空间换时间(不是指内存,而是指令变多编译出来的可执行程序会变大)的做法。内联函数在预编译的时候展开,会用函数体替换函数调用;内联函数可能会使目标文件变大,但是少了调用开销,增加程序运行的效率。
解析:C++中不能重载的运算符
.*
、::
、sizeof
、?:
、.
这5个运算符不能重载。
解析:
拷贝构造函数的函数名和类名相同,无返回值;
该函数的参数只有一个,是对该对象的引用,如果使用传值传参会一直调用拷贝构造函数形成无穷递归。
每个类都会有一个拷贝构造函数,当没有显示定义时,编译器会生成默认的拷贝构造函数,该构造函数默认是共有的
public
;拷贝初始化构造函数的作用是将一个已知对象的数据成员值(这里不区分浅拷贝还是深拷贝)拷贝给正在创建的另一个同类的对象
解析:常成员函数要用
const
修饰,const
应该在参数列表之后,如果在返回值前代表返回值不能修改,const
修饰*this
,表明在该成员函数中,不能修改非静态的成员变量。所以选C。
解析:重载函数是在同一作用域内,函数名相同,参数个数或者参数的类型不同,就构成重载函数,与函数类型无关。
解析:
MyClass a[5]
是一个有5个MyClass
对象的数组,MyClass *b[6]
是一个指针数组,该数组的每个元素都是MyClass*
。a[5]
数组中每个元素是一个类,每次创建都会调用它的构造函数,一共调用5次构造函数;但是b[6]
中的元素都是类的指针类型,就不会调用构造函数。指针在调用期间并不会调用构造函数。
解析:在初始化列表中初始化成员的次序与先后次序没有关系,是根据成员变量在类中声明的先后顺序进行初始化的。
解析:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐;静态成员不参与计算,因为数据保存在静态区;
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象,对于一个空类,它的大小为1,为了占位,没有实际意义。
9.
解析:A()是匿名对象,括号里面的值是初始化的一个值;A的构造函数中赋值,是后置++,先使用再++,计算就可以得到结果。
解析:对于
const
修饰的变量,是常变量,它具有常数属性,当&a
的时候,此时它的类型还是const int *
类型的,可以强制类型转换成int*
,然后对*p
进行修改,因为a
在栈区进行储存的,所以在打印a
的时候,回去常量区找,也就是直接替换成10,但打印*p
的时候会去储存的位置找,打印20。
编程题
1.井字棋
解析:解题思路:返回true的条件就是当一列/一行/正对角/反对角相同且全部为1的时候返回true;我们可以将每个位置相加,得到结果之后进行比较:当一列相同时,每个位置都是1,那结果就等于行数;当一行相同时,结果等于列数;当对角相同时,等于行数或者列数(因为要是有对角,就说明这个数组的行数和列数相同)。
class Board {
public:
bool checkWon(vector<vector<int> > board) {
// write code here
int row = board.size();
int col = board[0].size();
//先判断一行相同
int sum = 0;//用来记录相加之后的结果
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
sum += board[i][j];
}
if(sum == col)
return true;
}
//判断一列是否相同
sum = 0;
for(int i = 0; i < col; i++)
{
for(int j = 0; j < row; j++)
{
sum += board[j][i];
}
if(sum == row)
return true;
}
//判断对角是否相同
sum = 0;
//for(int i = 0; i < row; i++)
for(int i = 0; i < col; i++)
{
sum += board[i][i];
}
if(sum == col)
return true;
//判断反对角是否相同
sum = 0;
//for(int i = 0; i < row; i++)
for(int i = 0; i < col; i++)
{
sum += board[i][col-1-i];
}
if(sum == col)
return true;
return false;
}
};
2.密码强度等级
解析:注意条件即可。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1;
getline(cin, s1);
int word1 = 0; //小写字母
int word2 = 0;//大写字母
int num = 0;//数字
int count = 0;//符号
int score = 0;//分数
for (int i = 0; i < s1.length(); i++) {
if (s1[i] >= 'a' && s1[i] <= 'z')
word1++;
if (s1[i] >= 'A' && s1[i] <= 'Z')
word2++;
if (s1[i] >= '0' && s1[i] <= '9')
num++;
if ((s1[i] >= 0x21 && s1[i] <= 0x2F) || (s1[i] >= 0x3A && s1[i] <= 0x40) ||
(s1[i] >= 0x5B && s1[i] <= 0x60) || (s1[i] >= 0x7B && s1[i] <= 0x7E))
count++;
}
if (s1.length() <= 4) score += 5;
else if (s1.length() >= 5 && s1.length() <= 7) score += 10;
else if (s1.length() >= 8) score += 25;
if (word1 == 0 && word2 == 0) score += 0;
else if ((word1 == 0 && word2 != 0) || (word2 == 0 &&
word1 != 0)) score += 10;
else if (word1 != 0 && word2 != 0)
score += 20;
if (num == 0) score += 0;
else if (num == 1) score += 10;
else score += 20;
if (count == 0) score += 0;
else if (count == 1) score += 10;
else score += 25;
if (word1 > 0 && word2 > 0 && num > 0 && count > 0)
score += 5;
else if (word1 + word2 > 0 && num > 0 && count > 0)
score += 3;
else if (word1 + word2 > 0 && num > 0)
score += 2;
if (score >= 90) cout << "VERY_SECURE";
else if (score >= 80) cout << "SECURE";
else if (score >= 70) cout << "VERY_STRONG";
else if (score >= 60) cout << "STRONG";
else if (score >= 50) cout << "AVERAGE";
else if (score >= 25) cout << "WEAK";
else cout << "VERY_WEAK";
return 0;
}