C++测试题
一、基础入门
1.常量定义的方式:
#define day 7
const int day 7
2.三目运算符
c = a > b ? a : b;
3. switch
switch(score)
{
case 1:
case 2:
default:
}
4. 数组初始化
int arr[10] = {
1,2,3}; // 数组初始化
sizeof(arr)/sizeof(arr[0]); // 计算数组大小
int arr[][2]={
{
1,2},
{
3,4}
}; // 二维数组初始化
5. 函数值传递、地址传递
void swap(int num1, int num2){
}
swap(a,b); //值传递,不改变原值
void swap(int *p1,int *p2){
}
swap(&a,&b); //地址传递,改变原值
void swap(int &num1,int num2){
}
swap(a,b); //引用传递,改变原值
void swap(const int &num1,const int &num2){
}
swap(a,b); //常量引用 防止改变原值
6. 函数分文件编写
- 创建头文件.h,写入函数声明
- 创建源文件.cpp,写入函数定义
//头文件swap.h
#include<iostream>
using namespace std;
void swap(int a,int b);
//源文件swap.cpp
#include "swap.h"
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
cout << a << " " << b;
}
//main函数文件
#include "swap.h"
int main(){
int a=100,b=100;
swap(a,b);
}指针
7. 指针
int *p = &a;
cout << *p;
8.常量指针和指针常量
const int *p = &a; // 常量指针,值不可改
int * const p = &a; // 指针常量,地址不可改
9.指针和数组
//一维
int arr [] = {
1,2,3};
int *p = arr;
for(int i=0;i<10;i++){
cout << *p; << endl;
p++;
}
//二维:二维数组名是一个数组指针
int arr[][2] = {
{
1,2},{
3,4},{
5,6} };
int *p1 = arr[0]; // 指向a[0][1],p1++改变列
int (*p2)[2] = arr; // p2指向数组的指针,p2++改变行.
cout << *(*(p2+row)+col); // 指向a[row][col],
int *p2[2]; // 指针数组:每个元素是指针
10. 结构体
struct student{
string name;
int age;
}
student stu1 = {
'AMY',15};
cout << stu1.name;
student stuarr[3] = {
{
'AMY',15},{
'BOB',26},{
'CAT',37}};
student *pstu = &stu1;
cout << pstu->age;
二、C++核心编程
1.内存分区
- 代码区(函数体二进制代码)--------------编译后未执行前时存在,共享、只读
- 全局区(全局变量、静态变量、常量)-----编译后未执行前存在
- 栈区(形参、局部变量)-------------------程序运行后存在,不要返回局部变量的地址
- 堆区(程序员分配)
2.new
int *a = new int(10);
delete a;
int *arr = new int[10];
delete[] arr;
3.引用本质:指针常量
int a = 10;
int b = 20;
//引用必须初始化且之后不可改变
int &c = a; // 本质: int * const c = &a; 指针指向不可修改
c = b; // 赋值操作,本质 *c = b;
4. 引用做函数返回值
int& test01() {
int a = 10;
return a;
}
int& ref = test01(); //NO!不要返回局部变量引用,会被释放
int& test02() {
static int a = 20;
return a;
}
int& ref = test02(); //Yes!可以返回静态变量引用(全局区)
//函数返回的是a的引用,所以可以赋值
test02() = 1000; //函数调用作为左值
5. 函数默认参数
int func2(int a = 10, int b = 10);
//NO!声明和实现中只能一个有默认参数
int func2(int a = 10, int b = 20) {
return a + b;
}
6. 函数重载
函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件
void func(int a); //func(10);调用前一个
void func(int &a); // 是重载,但二义性 func(a);报错
void func(int a);
void func(const int a); // 不是重载
void func(int &a); // func(d); 传变量
void func(const int &a); // 是重载 func(10); 传常量
void func(int a);
void func2(int a, int b = 10);//是重载,但二义性
7. 文件操作
void test01() {
ofstream ofs; // 写文件
ofs.open("1.txt", ios::out);
ofs << "aaaaaaaaaa"<<endl;
ofs << "bbbbbbbbbb" << endl