小结
1 数组作函数实参
若使用数组作函数实参,则以下正确的说法是()
A 必须在主调函数中说明此数组的大小
B 实参数组类型与形参数组类型可以不匹配
C 在被调用函数中,不需要考虑形参数组的大小
D 实参数组名与形参数组名必须一致
- A选项:必须在主调函数中说明此数组的大小,不一定例如传递一个char类型的字符串,就不需要。所以A是错的。
- B选项:实参数组类型与形参数组类型可以不匹配。实参和形参,类型顺序必须一致,不然调用不了。B错
- C选项:在被调用函数中,不需要考虑形参数组的大小。因为传数组都是只传一个地址过来,而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。本选项说是不考虑形参数组的大小是对的。
- D选项:实参数组名与形参数组名必须一致,明显错误。
2 函数调用
以下程序的输出结果为( )
int i;
void prt( )
{ for(i=5;i<8;i++) printf("%c",'*');
printf("\t");
}
main( )
{ for(i=5;i<=8;i++) prt( );
}
全局变量 i main()中修改为i=5;
在 prt() 中执行循环后 修改后 i=8;
在main()中再次调用prt()时执行一次print("\t"),然后修改后 i=9;
结果为:***
3 逻辑运算符
设x为整型变量,不能正确表达数学关系1<x<5的C++逻辑表达式是()。
A 1< x <5
B x==2||x==3||x==4
C 1<x && x<5
D ! (x<=1)&&! (x>=5)
逻辑表达式,要使用逻辑运算符,逻辑与,逻辑或,逻辑非; 故为A
4 C语言特点
C语言是介于汇编语言和高级语言之间的一种语言,由于它可以直接访问物理地址,对硬件操作,所以C语言既可以编写应用程序,又可以开发系统软件,而且C语言程序可移植性好于汇编语言,程序清晰,具有模块化的特点。
5 运算符优先级
#include<stdio.h>
main(){
int a=3;
printf("%d\n",(a+=a-=a*a));
}
符合赋值运算符返回的是左值!!! 首先执行 a -= a*a ,这条表达式返回的应该是 a = -6,所以此时 a 的值已经是-6了, 然后执行 a += a,这条表达式返回的是 a = -12, 需要记住,赋值运算符和复合赋值运算符返回的是左值
考察:,赋值运算符和复合赋值运算、优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [ ] | 数组下标 | 数组名[整型表达式] | 左到右 | |
( ) | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针表达式 | 单目运算符 | ||
& | 取地址运算符 | &左值表达式 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof 表达式/sizeof(类型) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 表达式<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 表达式>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 |
6 虚函数
#include "stdio.h"
class Base
{
public:
int Bar(char x)
{
return (int)(x);
}
virtual int Bar(int x)
{
return (2 * x);
}
};
class Derived : public Base
{
public:
int Bar(char x)
{
return (int)(-x);
}
int Bar(int x)
{
return (x / 2);
}
};
int main(void)
{
Derived Obj;
Base *pObj = &Obj;
printf("%d,", pObj->Bar((char)(100)));
printf("%d,", pObj->Bar(100));
}
100,50
虚函数可以实现动态绑定。
1 |
|
这里讲pObj对象声明为Base类型,其实际类型是Derived类型
运行时,虚函数动态绑定,调用Derived类的Bar,非虚函数静态绑定,调用的是Base类中的Bar函数;
7 逻辑运算符的短路特性
下程序运行后的输出结果是
int main()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b<a)&&(m=a) ;
printf("%d,%d\n",k,m);
return 0;
}
0,1;考察逻辑运算符的短路特性,m=a在本例中不会执行。
8 拷贝构造函数声明
假定 TT 为一个类,则该类的拷贝构造函数的声明语句为:
TT (TT &x)
拷贝构造函数的形参不限制为const,但是必须是一个引用,以传地址方式传递参数。
9 C++函数默认参数
在 c++ 语言中,对函数参数默认值描述正确的是
在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值。
10 结构体定义
设有以下说明语句,则下面的叙述不正确的是().
struct stu
{
int a;
float b;
} stutype;
struct是结构体类型的关键字、struct stu是用户定义的结构体类型、a和b都是结构体成员名;
struct stu不是用户定义的结构体类型,而是类型;
11 转义字符
12 派生类的访问权限
派生类的函数中能够直接访问基类的 公有成员和保护成员。这句话是否正确?
错误;看子类以什么方式继承父类,方式有
class A{
public:
protected:
private:
}
class B :public A; //父类成员在子类中保持原有访问级别
class B :private A;//父类成员在子类中变为private成员
class B :protected A;
/*
父类中public成员会变成protected()
父类中protected成员仍然为protected
父类中private成员仍然为private
*/
13 输入输出流函数用法
能够把指定长度的字节序列插入到输出流中的函数是()。
write
考察:输入输出流相关函数
14 格式化输出
下面程序段执行后的输出结果是()(□表示一个空格)。
int a=3366;
printf("│%-08d│",a);
%-08d表示输出占8个空格的位置,并且左对齐,故为:│3366□□□□│
考察:输入输出格式
15 构造函数,
16 C++类中静态成员变量
c++的一个类中声明一个static成员变量,下面描述正确的是()
static是加了访问控制的全局变量,不被继承
考察:static
17 STL容器
下面哪几种是 STL 容器类型()
C++11 STL中的容器
一、顺序容器:
vector:可变大小数组;
deque:双端队列;
list:双向链表;
forward_list:单向链表;
array:固定大小数组;
string:与vector相似的容器,但专门用于保存字符。
二、关联容器:
按关键字有序保存元素:(底层实现为红黑树)
map:关联数组;保存关键字-值对;
set:关键字即值,即只保存关键字的容器;
multimap:关键字可重复的map;
multiset:关键字可重复的set;
无序集合:
unordered_map:用哈希函数组织的map;
unordered_set:用哈希函数组织的set;
unordered_multimap:哈希组织的map;关键字可以重复出现;
unordered_multiset:哈希组织的set;关键字可以重复出现。
三、其他项:
stack、queue、valarray、bitset
18 const用法
关于const说法
A. const int * const p = &x;
中指针p及p指向的int类型数据都被const修饰,即*p
与p
都为const属性无法修改
- 编译器报错
error: assignment of read-only location ‘*(const int*)p’ *p = 1;
- 故
* p =1;
语法错误
B. const int &q=x;
是指向常量的引用,使用时必须初始化,而且初始化后,引用值不可以改变,引用的常量也不能改变
- 注意 只是修饰引用
q
,x
不受影响 - 编译器报错
error: increment of read-only reference ‘q’ q++;
- 故
q++;
语法错误
C. int const *next=&x;
中const
修饰整型数 int即*next
- 注意 同样只是修饰
*next
,x
仍然是变量 - 指针变量
next
没有被const修饰因此可以被next++
改变,语法正确
D. const int *j=&x;
中const int *
同int const *
const修饰*j
- 编译器报错
error: increment of read-only location ‘* j’ (*j)++;
(*j)
为const属性无法修改,故语法错误
19 函数重载与重写
函数重载指
函数名相同,但形参的个数与类型不同、
20 友元函数
下列运算符重载函数中,属于友元函数的是( )
Base operator+(Base);
Base operator--(Base);
Base operator&&(Base, Base);
Base operator++(Base,int);
A选项中,operator+有两个参数,重载函数中只声明了一个参数,属于类的成员函数
B选项中,operator--前置运算符没有参数,后置运算符参数应为int型,因此它重载的是前置--友元函数
C选项中,operator&&有两个参数,属于类的友元函数
D选项中,重载的是operator++后置运算符,两个参数,为友元函数