首页 > 编程语言 >C++期末复习超详细总结知识点(期末冲刺)

C++期末复习超详细总结知识点(期末冲刺)

时间:2024-09-09 12:25:17浏览次数:6  
标签:知识点 函数 10 int C++ 运算符 期末 指针 cout

  1. 指数形式(即浮点形式)

1.5、字符型常量


作用:字符型变量用于显示单个字符

语法:char ch = 'a';

注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号

注意2:单引号内只能有一个字符,不可以是字符串

  • C和C++中字符型变量只占用1个字节。

  • 字符常量只能包括一个字符,如′AB′ 是不合法的

  • 字符常量区分大小写字母,如′A′′a′是两个不同的字符常量

  • 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

1.6、字符串型常量


作用:用于表示一串字符

两种风格

  1. C风格字符串char 变量名[] = "字符串值"

char str1[] = “hello world”;

注意:C风格的字符串要用双引号括起来

  1. C++风格字符串string 变量名 = "字符串值"

string str = “hello world”;

注意:C++风格字符串,需要加入头文件==#include==

字符串常量为双引号


常考:字符串 "abc" 在内存中占几个字节?

答:占4个字节,而不是3个字节,编译系统会在字符串最后自动加一个′\0′作为字符串结束标志。但′\0′并不是字符串的一部分,它只作为字符串的结束标志


常考: 字符串常量″abc\n″包含几个字符?

答:不是5个而是4个字符,其中“\n”是一个转义字符,但它在内存中占5个字节

1.7、布尔类型bool


作用:布尔数据类型代表真或假的值

bool类型只有两个值:

  • true — 真(本质是1)

  • false — 假(本质是0)

bool类型占1个字节大小

1.8、数据的输入输出


关键字:cin、cout

语法: cin >> 变量1>>变量2>>....>>变量ncout<<表达式1<<表达式2<<...<<表达式n

cout<<a,b,c; //错误,不能一次插入多项

cout<<a+b+c; //正确,这是一个表达式,作为一项

cin>>a>>b>>c>>d;

1.9、变量命名规则


  • C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线

  • 不能是关键字

  • 区分大小写

1.10、局部变量


  • 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的

  • 形参也是局部变量

1.11、全局变量


  • 在函数之外定义的变量是外部变量,称为全局变量

2、运算符

=======================================================================

2.1、算数运算符


| 运算符 | 术语 | 示例 | 结果 |

| — | — | — | — |

| + | 正号 | +3 | 3 |

| - | 负号 | -3 | -3 |

| + | 加 | 10 + 5 | 15 |

| - | 减 | 10 - 5 | 5 |

| * | 乘 | 10 * 5 | 50 |

| / | 除 | 10 / 5 | 2 |

| % | 取模(取余) | 10 % 3 | 1 |

| ++ | 前置递增 | a=2; b=++a; | a=3; b=3; |

| ++ | 后置递增 | a=2; b=a++; | a=3; b=2; |

| – | 前置递减 | a=2; b=–a; | a=1; b=1; |

| – | 后置递减 | a=2; b=a–; | a=1; b=2; |

注意

  • 两个整数相除结果依然是整数(这里不进行四舍五入,直接舍去小数点后面数字)

  • C++中两个小数可以相除

  • 运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理

  • 只有整型变量可以进行取模运算,两个小数不可以取模

  • 在除法运算中,除数不能为0

  • 取模运算时,除数也不能为0

常考:

  • 前置后置运算符单独使用没有什么区别

  • 前置递增先对变量进行++,再计算表达式

  • 后置递增先计算表达式,后对变量进行++

  • 请详细看下方代码并理解

//递增

int main() {

//后置递增

int a = 10;

a++; //等价于a = a + 1

cout << a << endl; // 11

//前置递增

int b = 10;

++b;

cout << b << endl; // 11

//区别

//前置递增先对变量进行++,再计算表达式

int a2 = 10;

int b2 = ++a2 * 10;

cout << b2 << endl; //110

//后置递增先计算表达式,后对变量进行++

int a3 = 10;

int b3 = a3++ * 10;

cout << b3 << endl; //100

system(“pause”);

return 0;

}

2.2、赋值运算符


作用:用于将表达式的值赋给变量

  • 请详细看表格即可

| 运算符 | 术语 | 示例 | 结果 |

| — | — | — | — |

| = | 赋值 | a=2; b=3; | a=2; b=3; |

| += | 加等于 | a=0; a+=2; | a=2; |

| -= | 减等于 | a=5; a-=3; | a=2; |

| *= | 乘等于 | a=2; a*=2; | a=4; |

| /= | 除等于 | a=4; a/=2; | a=2; |

| %= | 模等于 | a=3; a%2; | a=1; |

2.3、比较运算符


作用:用于表达式的比较,并返回一个真值或假值

  • 请详细看表格即可

| 运算符 | 术语 | 示例 | 结果 |

| — | — | — | — |

| == | 相等于 | 4 == 3 | 0 |

| != | 不等于 | 4 != 3 | 1 |

| < | 小于 | 4 < 3 | 0 |

| > | 大于 | 4 > 3 | 1 |

| <= | 小于等于 | 4 <= 3 | 0 |

| >= | 大于等于 | 4 >= 1 | 1 |

注意:C和C++ 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。

在这里插入图片描述

2.4、逻辑运算符


作用:用于根据表达式的值返回真值或假值

  • 请详细看表格即可

| 运算符 | 术语 | 示例 | 结果 |

| — | — | — | — |

| ! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 |

| && | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |

| || | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |

  • !非为三者中运算符最高的

在这里插入图片描述

3、流程结构

========================================================================

3.1、选择结构


3.1.1、if语句

  • if语句较为简单,常常搭配else使用,且可以嵌套使用

3.1.2、三目运算符

作用: 通过三目运算符实现简单的判断

语法:表达式1 ? 表达式2 :表达式3

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果。

  • 此处常出程序阅读题!!!!

3.1.3、switch语句

作用:执行多条件分支语句

语法

switch(表达式)

{

case 结果1:执行语句;break;

case 结果2:执行语句;break;

default:执行语句;break;

}

  • switch语句中表达式类型只能是整型或者字符型

  • case里如果没有break,那么程序会一直向下执行

3.2、循环结构


3.2.1、while

作用:满足循环条件,执行循环语句

语法:while(循环条件){ 循环语句 }

**解释:**只要循环条件的结果为真,就执行循环语句

3.2.2、do…while

作用: 满足循环条件,执行循环语句

语法: do{ 循环语句 } while(循环条件);

注意:与while的区别在于do…while会先执行一次循环语句,再判断循环条件(这里常考两者区别,记住无论怎样,do…while都会必然执行一次循环语句)

3.2.3、for

  • for循环中的表达式,要用分号进行分隔

int main() {

for (int i = 0; i < 10; i++)

{

cout << i << endl;

}

system(“pause”);

return 0;

}

3.3、跳转语句


3.3.1、break

作用: 用于跳出选择结构或者循环结构

3.3.2、continue

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

注意:continue并没有使整个循环终止,而break会跳出循环

4、数组

======================================================================

数组:所谓数组,就是一个集合,存放相同类型的数据元素

  • 数组中的每个数据元素都是相同的数据类型

  • 数组是由连续的内存位置组成的

4.1、一维数组


一维数组定义的三种方式:

  1. 数据类型 数组名[ 数组长度 ];(常用,了解其余两种即可)

  2. 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};

  3. 数据类型 数组名[ ] = { 值1,值2 ...};

int score[10];

int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 };

int score3[] = { 100,90,80,70,60,50,40,30,20,10 };

  • 数组中下标是从0开始索引

  • 在对全部数组元素赋初值时,可以不指定数组长度

  • 直接打印数组名,可以查看数组所占内存的首地址

  • 对数组名进行sizeof,可以获取整个数组占内存空间的大小

  • 以上三种方式并不要求都会,但是需要都见过,防止在程序改错中乱改

4.1.1、一维数组初始化

  1. 在定义数组时分别对数组元素赋予初值。例如

int a[10]={0,1,2,3,4,5,6,7,8,9};

  1. 可以只给一部分元素赋值。例如

int a[10]={0,1,2,3,4};

  1. 如果想使一个数组中全部元素值为1,可以写成

int a[10]={1,1,1,1,1,1,1,1,1,1};

int a[10]={1*10}; // 错误写法,不能给数组整体赋初值

  1. 在对全部数组元素赋初值时,可以不指定数组长度

int a[5]={1,2,3,4,5};

// 可以写成

int a[]={1,2,3,4,5};

4.2、二维数组


二维数组定义的四种方式:

  1. 数据类型 数组名[ 行数 ][ 列数 ];

  2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };

  3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};

  4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

int arr[2][3];

int arr2[2][3] =

{

{1,2,3},

{4,5,6}

};

int arr3[2][3] = { 1,2,3,4,5,6 };

int arr4[][3] = { 1,2,3,4,5,6 };

  • 以上4种定义方式,利用第二种更加直观,提高代码的可读性

  • 如果对全部元素赋初值,定义数组时对第一维的长度可以不指定,但是第二维的长度不能省略

4.3、字符数组


  • 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符

定义

char c[10] = {′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′};

赋值

只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值

char c[5];

c={′C′,′h′,′i′,′n′,′a′}; //错误,不能对整个数组一次赋值

C[0]=′C′; c[1]=′h′; c[2]=′i′; c[3]=′n′; c[4]=′a′; //对数组元素赋值,正确

int a[5],b[5]={1,2,3,4,5};

a=b; //错误,不能对整个数组整体赋值

a[0]=b[0]; //正确,引用数组元素

4.4、字符串函数


  • 字符串连接函数 strcat

  • 字符串复制函数 strcpy

  • 字符串比较函数 strcmp

  • 字符串长度函数 strlen

5、函数

======================================================================

作用:将一段经常使用的代码封装起来,减少重复代码

5.1、函数定义


函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数表列

4、函数体语句

5、return 表达式

语法:

返回值类型 函数名 (参数列表)

{

函数体语句

return表达式

}

  • 返回值类型 :一个函数可以返回一个值。在函数定义中

  • 函数名:给函数起个名称

  • 参数列表:使用该函数时,传入的数据

  • 函数体语句:花括号内的代码,函数内需要执行的语句

  • return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据

示例:定义一个加法函数,实现两个数相加

//函数定义

int add(int num1, int num2)

{

int sum = num1 + num2;

return sum;

}

5.2、函数调用


功能:使用定义好的函数

语法:函数名(参数)

int result = add(10,20);

  • 函数定义里小括号内称为形参,函数调用时传入的参数称为实参

  • 例如此处的num1,num2 为形参,10,20为实参

  • 函数不能嵌套定义但是可以嵌套调用(常考)

5.3、函数声明


  • 函数的声明可以多次,但是函数的定义只能有一次

//声明可以多次,定义只能一次

//声明

int max(int a, int b);

int max(int a, int b);

//定义

int max(int a, int b)

{

return a > b ? a : b;

}

int main() {

int a = 100;

int b = 200;

cout << max(a, b) << endl;

system(“pause”);

return 0;

}

5.4、值传递


  • 所谓值传递,即单向传递,就是函数调用时实参将数值传入给形参,而不能由形参传回来给实参。

  • 值传递时,如果形参发生改变,并不会影响实参(值传递时,形参是修饰不了实参的),请务必理解并记住,此处因篇幅就不进行讲解了!

5.5、函数默认参数


在C++中,函数的形参列表中的形参是可以有默认值的。

语法:返回值类型 函数名 (参数= 默认值){}

int func(int a, int b = 10, int c = 10) {

return a + b + c;

}

//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值

//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数

int func2(int a = 10, int b = 10);

int func2(int a, int b) {

return a + b;

}

int main() {

cout << "ret = " << func(20, 20) << endl;

cout << "ret = " << func(100) << endl;

system(“pause”);

return 0;

}

  • 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值

  • 如果函数声明有默认值,函数实现的时候就不能有默认参数

5.6、函数占位参数


C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法: 返回值类型 函数名 (数据类型){}

//函数占位参数 ,占位参数也可以有默认参数

void func(int a, int) {

cout << “this is func” << endl;

}

int main() {

func(10,10); //占位参数必须填补

system(“pause”);

return 0;

}

5.7、函数重载


作用:函数名可以相同,提高复用性

函数重载满足条件:

  • 函数名称相同

  • 函数参数类型不同 或者 个数不同 或者 顺序不同

注意: 函数的返回值不可以作为函数重载的条件

//函数重载需要函数都在同一个作用域下

void func()

{

cout << “func 的调用!” << endl;

}

void func(int a)

{

cout << “func (int a) 的调用!” << endl;

}

void func(double a)

{

cout << “func (double a)的调用!” << endl;

}

void func(int a ,double b)

{

cout << “func (int a ,double b) 的调用!” << endl;

}

void func(double a ,int b)

{

cout << “func (double a ,int b)的调用!” << endl;

}

//函数返回值不可以作为函数重载条件

//int func(double a, int b)

//{

// cout << “func (double a ,int b)的调用!” << endl;

//}

int main() {

func();

func(10);

func(3.14);

func(10,3.14);

func(3.14 , 10);

system(“pause”);

return 0;

}

5.8、重载运算符规则


C++中有以下五个运算符不能重载

| 成员访问运算符 | 成员指针访问运算符 | 域运算符 | 长度运算符 | 条件运算符 |

| — | — | — | — | — |

| . | .* | :: | sizeof | ?: |

重载运算符规则

  1. 重载不能改变运算符运算对象(即操作数)的个数

  2. 重载不能改变运算符的优先级别

  3. 重载不能改变运算符的结合性

  4. 运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数


什么时候应该用成员函数方式,什么时候应该用友元函数方式?二者有何区别呢?()

  • 一般将单目运算符重载为成员函数,将双目运算符(二元运算符)重载为友元函数

  • 重载为类的成员函数 - operator 函数有一个参数

  • 重载为类的友元函数 - operator 函数有两个参数

  • 只能将重载 “>>” (流插入运算符)和“<<” (流提取运算符)的函数作为友元函数或者普通函数重载,而不能将它们定义为成员函数,因为参数为两个

  • 类型转换运算符只能作为成员函数重载

单目运算符:只有一个操作数,如 !,-(负号),&,*,++,–

双目运算符:*,/,%,+,-,==,!=,<,>,<=,>=,&&,||

5.9、内联函数


  • 指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。

inline int max(int a,int b);

  • 使用内置函数可以节省运行时间

  • 只有那些规模较小而又被频繁调用的简单函数,才适合于声明为inline函数。

5.10、函数模板


语法:

template

函数声明或定义

解释:

template — 声明创建模板

typename — 表面其后面的符号是一种数据类型,可以用class代替

T — 通用的数据类型,名称可以替换,通常为大写字母

只适用于函数体相同、函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。

6、指针

======================================================================

指针的作用: 可以通过指针间接访问内存

6.1、指针变量


指针变量定义语法: 数据类型 * 变量名;

  • 请看下方代码示例,理解指针变量的定义与使用,期末一般不会出太难指针的题,但是基本用法一定要会!!

int main() {

//1、指针的定义

int a = 10; //定义整型变量a

//指针定义语法: 数据类型 * 变量名 ;

int * p;

//指针变量赋值

p = &a; //指针指向变量a的地址

cout << &a << endl; //打印数据a的地址

cout << p << endl; //打印指针变量p

//0073F8BC

//0073F8BC

//2、指针的使用

//通过*操作指针变量指向的内存

cout << "*p = " << *p << endl;

// *p = 10

system(“pause”);

return 0;

}

指针变量和普通变量的区别

  • 普通变量存放的是数据,指针变量存放的是地址

  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

总结1: 我们可以通过 & 符号 获取变量的地址

总结2:利用指针可以记录地址

总结3:对指针变量解引用,可以操作指针指向的内存

总结4:所有指针类型在32位操作系统下是4个字节(了解)

6.2、const修饰指针


const修饰指针有三种情况

  1. const修饰指针 — 常量指针

  2. const修饰常量 — 指针常量

  3. const既修饰指针,又修饰常量

int main() {

int a = 10;

int b = 10;

//const修饰的是指针,指针指向可以改,指针指向的值不可以更改

const int * p1 = &a;

p1 = &b; //正确

//*p1 = 100; 报错

//const修饰的是常量,指针指向不可以改,指针指向的值可以更改

int * const p2 = &a;

//p2 = &b; //错误

*p2 = 100; //正确

//const既修饰指针又修饰常量

const int * const p3 = &a;

//p3 = &b; //错误

//*p3 = 100; //错误

system(“pause”);

return 0;

}

技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

6.3、指针和数组


作用:利用指针访问数组中元素

  • C++规定,数组名就是数组的起始地址

  • 数组的指针就是数组的起始地址

  • 数组名可以作函数的实参和形参,传递的是数组的地址

int main() {

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

int * p = arr; //指向数组的指针

cout << "第一个元素: " << arr[0] << endl; //1

cout << "指针访问第一个元素: " << *p << endl; //1

for (int i = 0; i < 10; i++)

{

//利用指针遍历数组

cout << *p << endl;

p++;

}

system(“pause”);

return 0;

}

6.4、指针和函数


作用:利用指针作函数参数,可以修改实参的值(地址传递

//值传递

void swap1(int a ,int b)

{

int temp = a;

a = b;

b = temp;

}

//地址传递

void swap2(int * p1, int *p2)

{

int temp = *p1;

*p1 = *p2;

*p2 = temp;

}

int main() {

int a = 10;

int b = 20;

swap1(a, b); // 值传递不会改变实参

swap2(&a, &b); //地址传递会改变实参

cout << "a = " << a << endl;

cout << "b = " << b << endl;

system(“pause”);

return 0;

}


int a[10];

int *p = &a[0]; // 等价于 int *p = a;

*p = 1; // 等价于 a[0] = 1;

*(p+1) = 2; // 等价于 a[1] = 2;

// 所以 *(p+1) = a[1]; *(p+2) = a[2];

  • C++规定, p+1 指向数组的 下一个元素

void main()

{

int array[10];

// 用数组名作形参,因为接收的是地址,所以可以不指定具体的元素个数

f(array,10);

}

// 形参数组

f(int arr[],int n)

{

}


void main()

{

int a[10];

// 实参数组

f(a,10);

}

// 形参指针

f(int *x,int n)

{

}

总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递

6.4、返回指针值的函数


  • 返回指针值的函数简称指针函数。

  • 定义指针函数的一般形式为:

// 类型名 * 函数名(参数列表)

int * a(int x,int y);

7、引用

======================================================================

作用: 给变量起别名

语法: 数据类型 &别名 = 原名

int main() {

int a = 10;

int &b = a;

cout << "a = " << a << endl;

cout << "b = " << b << endl;

// 10

// 10

b = 100;

cout << "a = " << a << endl;

cout << "b = " << b << endl;

// 100

// 100

system(“pause”);

return 0;

}

7.1、引用注意事项


  • 引用必须初始化

int &c; // 错误,引用必须初始化

  • 在声明一个引用后,不能再使之作为另一变量的引用

7.2、引用做函数参数


作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

  • 通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单

//1. 值传递

void mySwap01(int a, int b) {

int temp = a;

a = b;

b = temp;

}

//2. 地址传递

void mySwap02(int* a, int* b) {

int temp = *a;

*a = *b;

*b = temp;

}

//参数:把地址传进去,用指针接收

//3. 引用传递

void mySwap03(int& a, int& b) {

int temp = a;

a = b;

b = temp;

}

//参数:别名,下面的a是上面的a的别名,用别名操作修改可原名操作修改是一样的

int main() {

int a = 10;

int b = 20;

// 值传递,形参不会修饰实参

mySwap01(a, b);

cout << “a:” << a << " b:" << b << endl;

// a:10 b:20

// 地址传递,形参会修饰实参

mySwap02(&a, &b);

cout << “a:” << a << " b:" << b << endl;

// a:20 b:10

// 引用传递,形参会修饰实参

mySwap03(a, b);

cout << “a:” << a << " b:" << b << endl;

// a:20 b:10

system(“pause”);

return 0;

}

7.3、引用做函数返回值


作用:引用是可以作为函数的返回值存在的

//数据类型后加&,相当于用引用的方式返回

int& test02() {

// 必须使用静态变量,需加 static 关键字

static int a = 20;

return a;

}

int main(){

int& ref2 = test02();

system(“pause”);

return 0;

}

8、类和对象

========================================================================

8.1、struct和class区别


在C++中 struct和class唯一的区别就在于 默认的访问权限不同

区别:

  • struct 默认权限为公共

  • class 默认权限为私有

8.1、构造函数和析构函数


  • 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。

  • 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。


构造函数语法:类名(){}构造和析构很容易出选择题,特点要记住

  1. 构造函数,没有返回值也不写void

  2. 构造函数的名字必须与类名相同

  3. 构造函数可以有参数,因此可以发生重载

  4. 程序在调用对象时候会自动调用构造函数,无须手动调用,而且只会调用一次(构造函数不需用户调用,也不能被用户调用)


析构函数语法: ~类名(){}

  1. 析构函数,没有返回值也不写void

  2. 函数名称与类名相同,在名称前加上符号~

  3. 析构函数不可以有参数,因此不可以发生重载

  4. 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

class Person

{

public:

//构造函数

Person()

{

cout << “Person的构造函数调用” << endl;

}

//析构函数

~Person()

{

cout << “Person的析构函数调用” << endl;

}

};

void test01()

{

Person p; //在栈上的数据,test01()执行完毕后,释放这个对象

}

int main() {

test01();

system(“pause”);

return 0;

}

8.3、构造函数分类与调用


构造函数按参数分为: 有参构造和无参构造

调用方式:括号法

class Person {

public:

//无参(默认)构造函数

Person() {

cout << “无参构造函数!” << endl;

}

//有参构造函数

Person(int a) {

age = a;

cout << “有参构造函数!” << endl;

}

//析构函数

~Person() {

cout << “析构函数!” << endl;

}

public:

int age;

};

//2、构造函数的调用

//调用无参构造函数

void test01() {

Person p; //调用无参构造函数

}

//调用有参的构造函数

void test02() {

// 括号法,常用

Person p1(10);

}

  • 尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行

8.4、初始化列表


  • C++提供了初始化列表语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2)... {}

class Person {

public:

传统方式初始化

//Person(int a, int b, int c) {

// m_A = a;

// m_B = b;

// m_C = c;

//}

//初始化列表方式初始化

Person(int a, int b, int c) :m_A(a), m_B(b), m_C© {}

void PrintPerson() {

cout << “mA:” << m_A << endl;

cout << “mB:” << m_B << endl;

cout << “mC:” << m_C << endl;

}

private:

int m_A;

int m_B;

int m_C;

};

int main() {

Person p(1, 2, 3);

p.PrintPerson();

system(“pause”);

return 0;

}

8.5、类对象作为类成员


C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员

例如:

class A {}

class B

{

A a;

}

  • B类中有对象A作为成员,A为对象成员

  • 那么当创建B对象时,A与B的构造和析构的顺序是谁先谁后?

  • 先调用对象成员的构造,再调用本类构造(如上例中,先调用A的构造函数)

  • 析构顺序与构造相反

8.6、静态成员


静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

  • 静态成员变量

  • 所有对象共享同一份数据

  • 在编译阶段分配内存

  • 类内声明,类外初始化

  • 静态成员函数

  • 所有对象共享同一个函数

  • 静态成员函数只能访问静态成员变量

**示例1 **:静态成员变量

class Person

{

public:

static int m_A; //静态成员变量

//静态成员变量特点:

//1 在编译阶段分配内存

//2 类内声明,类外初始化

//3 所有对象共享同一份数据

private:

static int m_B; //静态成员变量也是有访问权限的

};

int Person::m_A = 10;

int Person::m_B = 10;

void test01()

{

//静态成员变量两种访问方式

//1、通过对象

Person p1;

p1.m_A = 100;

cout << "p1.m_A = " << p1.m_A << endl;

Person p2;

p2.m_A = 200;

cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据

cout << "p2.m_A = " << p2.m_A << endl;

//2、通过类名

cout << "m_A = " << Person::m_A << endl;

//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到

}

int main() {

test01();

system(“pause”);

return 0;

}

示例2:静态成员函数

class Person

{

public:

//静态成员函数特点:

//1 程序共享一个函数

//2 静态成员函数只能访问静态成员变量

static void func()

{

cout << “func调用” << endl;

m_A = 100;

//m_B = 100; //错误,不可以访问非静态成员变量

}

static int m_A; //静态成员变量

int m_B; //

private:

//静态成员函数也是有访问权限的

static void func2()

{

cout << “func2调用” << endl;

}

};

int Person::m_A = 10;

void test01()

{

//静态成员变量两种访问方式

//1、通过对象

Person p1;

p1.func();

//2、通过类名

Person::func();

//Person::func2(); //私有权限访问不到

}

int main() {

test01();

system(“pause”);

return 0;

}

8.7、const修饰成员函数


标签:知识点,函数,10,int,C++,运算符,期末,指针,cout
From: https://blog.csdn.net/2401_86436674/article/details/142052975

相关文章

  • 揭秘 C++ List 容器背后的实现原理,带你构建自己的双向链表
    本篇博客,我们将详细讲解如何从头实现一个功能齐全且强大的C++List容器,并深入到各个细节。这篇博客将包括每一步的代码实现、解释以及扩展功能的探讨,目标是让初学者也能轻松理解。一、简介1.1、背景介绍在C++中,std::list是一个基于双向链表的容器,允许高效的插入和......
  • 如何实现标准库般强大的 C++ Vector?:从动态扩容到移动语义到迭代器全覆盖
    在C++中,std::vector是最常用的动态数组容器。它具有高效的内存管理、动态扩容、随机访问等特点。在这篇博客中,我们将从零开始,实现一个功能强大、灵活、并且具有高性能的Vector类,具备std::vector的大部分功能,包括动态扩容、迭代器、模板支持、随机访问等,尽可能模仿C+......
  • C++里面的iostream是什么东西?
    小弟不才,看了百度的介绍更乱了。。我刚接触c++,我感觉很有意思,今天看c++primer里面介绍过iostream。但是怎么看都不懂。代码里面也出现了#include<iostream>。我想请教一下,iostream是个库,可不可以理解成是一个仓库,里面装的都是C的代码?另外,IO是不是iostream的缩写? C++编译系统提......
  • C++学习笔记(曾经我看不懂的代码2:基于范围的for循环、auto使用、stl容器、template模
    不知不觉c++程序设计:标准库已经看了一大半了,学到了很多,很多曾经在网上和在书上看到却看不懂的代码,在看完标准库中的大半内容以后,都能大致的理清代码的含义。代码模板一:for(auto&a:arr)1、基于范围的for循环:a为迭代变量,arr为迭代范围,&表示引用。写一个例子:#include<ios......
  • C++ iostream、iomanip 头文件详解
    C++iostream、iomanip头文件详解首先,我们来看看iostream。相信大家都知道iostream,这个库可以说是最常用的几个库之一了。iostream库提供了输入输出流。比如cin、cout,都是在iostream里的。所以,我们经常会用到iostream这个库。iostream这个名字很好理解,InputOutputStream,输......
  • C/C++中extern函数使用详解
    extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定目录一、定义和声明的区别二、extern用法2.1extern函数2.2extern变量2.3在C++文件中调用C方式编译的函数三、通俗讲......
  • C++ 模板进阶知识——stdenable_if
    目录C++模板进阶知识——std::enable_if1.简介和背景基本语法使用场景2.`std::enable_if`的基本用法示例:限制函数模板只接受整数类型3.SFINAE和std::enable_if示例:使用SFINAE进行函数重载SFINAE的优点应用场景4.在类模板中使用std::enable_if示例:根据类型......
  • 南沙信奥赛C++陈老师解一本通题: 1326:【例7.5】 取余运算(mod)
    ​【题目描述】【输入】输入b,p,k的值。【输出】【输入样例】2109【输出样例】2^10mod9=7 #include<iostream>#include<stdlib.h>usingnamespacestd;longlongb,p,k,ans=1;intmain(){ cin>>b>>p>>k; for(inti=1;i<=p;i++) { ans*=b;......
  • [C++ Daily] 确保类复制了所有应该复制的成员
    确保类复制了所有应该复制的成员结果:源代码:#include<iostream>#include<string>#include<vector>/***copy操作应该包含对象内的所有成员变量及所有父类的成员变量,*此种可以通过调用对应的拷贝构造与拷贝赋值操作完成*////@briefsimpleterminalprint......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......