不能重载的运算符
* sizeof运算符
* :: 作用域解析运算符
* ?: 条件运算符
* . 直接成员运算符
* .* 成员指针运算符
* tpeid
* const_cast
* dynamstic_cast
* reinterpret_cast
* static_cast
只能通过成员函数进行重载
* = 赋值运算符
* () 函数调用运算符
* [] 下标
* -> 间接成员运算符
大部分的操作符是可以被重载的,例外的只有“.”、“::”、“?:”和“sizeof”。没有什么非禁止operator?:重载的理由,只不过没有必要而已。另外,expr1?expr2:expr3的重载函数无法保证expr2和expr3中只有一个被执行。
而“sizeof”无法被重载是因为不少内部操作,比如指针加法,都依赖于它。
全局变量和static修饰的局部变量默认初始化为 0 。因为全局变量和static静态局部变量存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0x00。
复制代码
1 2 3 4 5 6 7 8 | void AlphabetCounting(char a[],int n){ int count[26] = {}, i, kind = 10; for(i = 0;i < n;++i) (1); for(i = 0;i < 26;++i){ if(++kind > 1) putchar(';'); printf("%c=%d", (2)); } } |
以下能补全程序,正确功能的选项是()
++count[a[i]-'Z'];'Z'-i,count['Z'-i]
++count['A'-a[i]];'A'+i,count[i]
++count[i];i,count[i]
++count['Z'-a[i]];'Z'-i,count[i]
++count[a[i]];'A'+i,count[a[i]]
备注:若参与运算的数据类型不同,则首先应该转化成同一类型的数据,转化按照精度增加或者不变的方向进行,以保证精度不会降低。
字符集为每个字符分配了唯一的编号,每个字符除了用它本身的实体表示外,还可以用转义字符来表示
转义字符以\开始,如果是\x(注意是小写,C语言是区分大小写的)开头,后面接16进制数,如果以\开头,后面接八进制数。
转移字符表示的数据范围有限,因此对\x开头的 ,只能是\xxx(后面两位表数据)这种格式的,意思是只能接两位数据,最大值为\x7f
对\开头的,后面可以接三位数据,即\xxx(后三位均为数),最大值为\177
另外,还有其他几个常见的转义字符,
\t ,\n,\a,\b,\r,\f,\v
1 2 3 4 5 | void main() { char c = 'a'; if ('a' < c <= 'z') printf ("Low”); else printf("UP"); } |
LOW
UP
LOWUP
程序语法错误
【解释】关系运算符具有左结合性,所以表达式(’a'<c<=’z’)将先求’a'<c的值,即为
0(假),再求0<=’z’的值,即为1(真),所以执行if后面的语句printf("LOW");故正确
答案为A。
#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(*itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<""; } return 0; } |
下面这个代码输出的是()
100 300 300 300 300 500
100 3OO 300 300 500
100 300 300 500
100 300 500
100 500
程序错误
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),
在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环
进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。
所有整个过程中,只删除了2个值为300的元素。
setbase
setfill
setprecision
setw
setw(n)用法: 通俗地讲就是预设宽度
如 cout<<setw(5)<<255<<endl;
结果是:
(空格)(空格)255
▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充
如 cout<<setfill('@')<<setw<<255<<endl;
结果是:
@@255
▲setbase(int n) : 将数字转换为 n 进制.
如 cout<<setbase(8)<<setw(5)<<255<<endl;
cout<<setbase(10)<<setw(5)<<255<<endl;
cout<<setbase(16)<<255<<endl;
结果是:
(空格)(空格)377
(空格)(空格) 255
(空格)(空格) ff
▲ setprecision用法
使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。
如果与setiosnags(ios::scientific)合用, 可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。
例如,下面的代码分别用浮点、定点和指数方式表示一个实数:
#include <iostream> #include <iomanip>
int main() { double amount = 22.0/7;
cout << amount << endl; cout << setprecision(0) << amount << endl << setprecision(1) << amount << endl << setprecision(2) << amount << endl << setprecision(3) << amount << endl << setprecision(4) << amount << endl;
cout << setiosflags(ios::fixed); cout << setprecision(8) << amount << endl; cout << setiosflags(ios::scientific) << amount <<endl; cout <<setprecision(6); //重新设置成原默认设置
return 0; } |
运行结果为:
3.14286
3
3
3.1
3.14
3.143
3.14285714
3.14285714e+00
1 2 3 4 5 6 7 8 | struct st_t { int status; short *pdata; char errstr[32]; }; st_t st[16]; char *p = (char *)(st[2].esstr + 32); printf("%d", (p - (char *)(st))); |
32
120
114
144
根据字节对齐,在64位系统下struct st_t 结构体占用的字节为48个。
struct st_t {
int status; //占用8个(后面的4个为对齐位)
short *pdata;//占用8个
char errstr[32];//占用32个
};
char *p=(char *)(st[2].esstr+32),p实际指向了st[3]
则p-(char *)(st)),即为&st[3]-&st[0],占用空间为3个结构体的大小,即3*48=144,选D
构造函数
静态成员函数
内联函数
友元函数
以上几类函数都不可声明为虚函数:
构造函数:虚函数是运行时绑定,需要对象,所以要先调用构造函数
静态成员函数:只有一份大家共享
内联函数:编译时就展开,而虚函数是运行时绑定
友元函数:友元函数不能被继承,所以不存在虚函数