c/c++零基础坐牢第十四天

c/c++从入门到入土(14)

开始时间2023-05-22 16:55:49

结束时间2023-05-23 00:21:28

前言:在计划中,c语言篇章还有两节,但期末考试将至,得把c艹提上日程,并且c艹坐牢篇章也会更加紧凑,小编要花大量时间复习课本(要知道课本有五百多页),以课本内所悟心得体会为主。今日学习 第一章 绪论、第二章 C++语言简单程序设计、第三章 函数、第六章 数组、指针与字符串,参考于清华大学出版社郑莉老师的《C++语言程序设计》第五版,以下为自制思维导图:

 第一章 绪论 作业一 CPP基础

前言:以下分为两个部分,一、课本有关的读书笔记与体会,二、一份c++的作业及解析,可能有也可能没有。

读书笔记与体会

复制代码
 1 语言是思维的工具,思维是通过语言来表述的。
 2 自从1946年2月世界上第一台数字电子计算机ENIAC诞生以来,在这短暂的70多年间,计算机科学得到了迅猛发展。
 3 软件包括了使计算机运行所需的各种程序及其有关的文档资料。
 4 程序是指令的合集,所谓指令,就是计算机可以识别的命令。
 5 一台计算机硬件系统能够识别的所有指令的集合,称为它的指令系统。
 6 由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。
 7 汇编语言,它将机器指令映射为一些可以被人读懂的助记符,因为它的抽象层次太低,程序员需要考虑大量的机器细节。
 8 高级语言,它屏蔽了机器的细节,提高了语言的抽象层次,,程序中可以采用具有一定含义的数据命名和容易理解的执行语句。高级语言存在的主要问题是程序中的数据和操作分离,不能够有效地组成与自然界中的具体事物紧密对应的程序成分。
 9 开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称为该软件的问题域。
10 面向对象的编程语言将客观事物看作具有属性和行为(或称为服务)的对象,通过抽象找出同一类对象的共同属性和行为,形成类。
复制代码
面向对象的方法
面向对象的软件开发

↑点击加号展开。

 1 计算机加工的对象是数据信息,而指挥计算机操作的是控制信息,因此计算机内部的信息可以分成两大类,如图所示:

复制代码
 1 R进制中的数使用0~(R-1)个数字符号。
 2 采用二进制码表示信息,有如下几个优点:1)易于物理实现2)二进制数运算简单3)机器可靠性高4)通用性强。
 3 信息的单位通常采用“位”“字节”“字”:
 4 位(bit):度量数据的最小单位,表示1位二进制信息。
 5 字节(byte):一字节由8位二进制数字组成(1byte=8bit)。字节是信息存储中最常见的基本单位。计算机的存储器(包括内存和外存)通常也是以多少字节来表示它的容量。
 6 字(word):字是位的组合,并作为一个独立的信息单位处理。字又称计算机字,它的含义取决于机器的类型、字长以及使用者的要求。常用的固定字长有8位、16位、32位、64位等。
 7 机器字长:在讨论信息单位时,还有一个与机器硬件指标有关的单位,这就是机器字长。机器字长一般是指参加运算的寄存器所含有的二进制数的位数。
 8 数有正负之分,一般情况,用0表示正号,1表示符号,符号位放在数的最高位。
 9 为了改进符号数的运算方法和简化运算器的硬件结构,人们研究了符号数的多种二进制编码方法,其实是对负数表示的不同编码。
10 原码,将符号位数字化为0或1,数的绝对值与符号一起编码,即所谓“符号—绝对值表示”的编码称为原码。“[X]原”就是机器数,X称为机器数的真值。当采用原码表示法时,编码简单直观,与真值转换方便。但原码也存在一些问题,一是零的表示不唯一,二是用原码进行四则运算时,符号位需单独处理,且运算规则复杂。
11 反码,正数的反码与原码表示相同。负数反码的符号位与原码相同(仍用1表示),其余各位取反(0变1,1变0)。
12 补码,对于一个负数,其补码由该数反码的最末位加1求得。
13 对于正数来说,其原码、反码、补码形式相同。
14 符号位可作为数值参加运算,补码运算的结果仍为补码。
信息的表示与存储
复制代码
复制代码
1 源程序:用源语言编写的、有待翻译的程序,称为“源程序”。
2 目标程序:是源程序通过翻译加工以后所生成的程序。目标程序可以用机器语言表示(因此也称之为“目标代码”),也可以用汇编语言或其他中间语言表示。
3 翻译程序:是指用来把源程序翻译为目标程序的程序。对翻译程序来说,源程序是它的输入,而目标程序则是其输出。
4 翻译程序有3种不同类型:汇编程序、编译程序、解释程序。
5 c++程序的开发通常要经过编辑、编译、连接、运行测试这几个步骤,编辑是将源程序输入计算机中,生成磁盘文件。编译是将程序的源代码转换为机器语言代码。但是编译后的程序还不能由计算机执行,还需要连接。连接是将多个目标文件以及库中的某些文件连在一起,生成一个可执行文件。最后还要对程序进行运行和调试。
程序开发的基本概念
复制代码

↑点击加号以展开。

( )不是面向对象程序设计的主要特征。
A.封装

B.继承

C.多态

D.结构

答案:D

体会:面向对象的主要特征为抽象、封装、继承、多态。

每个 C++程序中都必须包含有这样一个函数,该函数的函数名为( )。
A.main

B.MAIN

C.Name

D.function

答案:A

C++对C语言作了很多改进,下列描述中()使得C语言发生了质变,从面向过程变成了面向对象。
A.增加了一些新的运算符;

B.允许函数重载,并允许设置缺省参数;

C.规定函数说明必须用原型;

D.引进了类和对象的概念;

答案:D

对象之间的相互作用和通信是通过消息,以下( )不是消息的组成部分。
A.接受消息的对象

B.要执行的函数的名字

C.要执行的函数的内部结构

D.函数需要的参数

答案:C

关于C++与C 语言关系的描述中,( )是错误的。
A.C 语言是C++语言的一个子集

B.C 语言与C++语言是兼容的

C.C++语言对C 语言进行了一些改进

D.C++语言和C 语言都是面向对象的

答案:D

所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个()
A.对象

B.类

C.函数体

D.程序块

答案:B

复制代码
关于面向对象程序设计
面向对象程序设计主要考虑的是提高软件的 ▁▁▁▁▁。
A.可靠性

B.可移植性

C.可修改性

D.可重用性
复制代码

答案:D

复制代码
关于面向对象的特征▁▁▁▁▁ 不是面向对象的特征。

A.多态性

B.继承性

C.封装性

D.过程调试
复制代码

答案:D

复制代码
关于实现与访问的分离
软件部件的内部实现和外部可访问性分离,这是指软件的 ▁▁▁▁▁。

A.封装性

B.继承性

C.共享性

D.抽象性
复制代码

答案:A

复制代码
关于标识符

下列关于标识符的叙述中,▁▁▁▁▁ 是错误的。

A.用户所定义的标识符允许使用关键字

B.用户所定义的标识符应尽量做到“见名知义”

C.用户所定义的标识符必须以字母或下划线打头

D.用户所定义的标识符中,大、小写字母代表不同的标识
复制代码

答案:A

在面向对象的方法中,类的实例称为 对象。
结构化程序设计具有很多优点,是一种面向 过程 的程序设计方法。
在面向对象程序设计中,消息 是指一个类实例和另一个类实例之间传递的信息。
对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可能导致完全不同的行为,这种现象称为 多态。
类是具体由共同属性和服务构成的一组对象的集合,它为属于该类的全部对象提供了抽象的描述,其内部包括 属性和行为两个主要部分。

编程题

复制代码
7-1 二进制数转十进制数
分数 10
作者 陈晓梅
单位 广东外语外贸大学
输入仅由0和1构成的正的二进制数(不超过32位), 以换行符结束。输出该数对应的十进制数。

输入格式:
输入仅由0和1构成的二进制数。

输出格式:
输出相应的十进制数。

输入样例:
在这里给出一组输入。例如:

101100
输出样例:
在这里给出相应的输出。例如:

44
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
问题描述
复制代码
复制代码
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
    bitset<32>a;
    cin>>a;
    cout<<a.to_ulong()<<endl;
    return 0;
}
复制代码

第二章 C++简单程序设计 作业二 基本输入输出

复制代码
 1 C语言最初是贝尔实验室的Dennis Ritchie在B语言的基础上开发出来的,1972年在一台DEC PDP-11计算机上实现了最初的c语言。
 2 C++语言便是在C语言的基础上为支持面向对象的程序设计而研制的、一个通用目的的程序设计语言,它是在1980年由AT&T贝尔实验室的Bjarne Stroustrup博士创建的。
 3 对象是程序的基本单位,然而对象的属性往往需要用某种类型的数据来表示,对象的功能和行为要由成员函数来实现,而函数的实现归根到底还是算法的设计。
 4 关键字是C++语法中预先规定的词汇,它们在程序中有特定的含义。
 5 标识符是程序员定义的单词,它的命名程序正文中的一些实体,如函数名、变量名、类名、对象名等。
 6 C艹语言标识符的构成规则如下:1)以大写字母、小写字母或下划线(_)开始。2)可以由以大写字母、小写字母、下划线(_)或数字0~9组成。3)大写字母和小写字母代表不同的标识符。4)不能是C++语言关键字或操作符。
 7 文字是在程序中直接使用符号表示的数据,包括数字、字符、字符串和布尔文字。
 8 操作符是用于实现各种运算的符号。
 9 分隔符用于分隔各个词法记号或程序正文。
10 在程序编译时的语法分析阶段将程序正文分解为词法记号和空白。
11 c艹语言中,有两种给出注释的方法,一种是沿用c语言的方法,使用/**/括起来注释文字。另一种是使用“//”的方法,从“//”开始,直到它所在行的行尾,所有字符都被作为注释处理。
c艹语言概述
复制代码
复制代码
1 ISOc艹标准没有明确规定每种数据类型的字节数和取值范围,它只是规定他们之间的字节数大小满足:
2 signed char<=short int<=int<=long int<=long long int不同编译器对此有不同表现。
3 常量、变量与c语言表现基本相同,详见坐牢第二天。
4 符号常量在使用之前一定要首先声明,注意符号常量在声明时一定要初始化,而在程序中间不能改变其值。
5 常量表达式是一类值不能发生改变的表达式,其值在编译阶段确定,便于程序优化。之前介绍的常量就是常量表达式,由常量表达式初始化的const对象也是常量表达式。一个对象或表达式是否为常量表达式取决于它的类型与初始值。
6 实际编程中,很难确定初始值是否是常量,为此引入constexpr关键字,以便由编译器来验证变量的值是否是一个常量表达式。constexpr修饰的变量暗含了const属性,并且必须由常量表达式初始化。
7   constexpr int size=get_size();
8 尽管不能用普通函数初始化constexpr变量的值,但当get_size()是constexpr函数时上述声明能编译通过,这样就确保了size是常量表达式。constexpr函数是一种特殊的函数,该函数应该足够简单以使得编译时就可以确定结果。
9 运算符和表达式详见坐牢第二天。
基本数据类型和表达式
复制代码
复制代码
 1 在c艹语言中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建立,使用后要被删除。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。数据的输入输出是通过I/O流来实现的,cin和cout是预定义的流类对象,cin用来处理标准输入,通常为键盘输入。cout用来处理标准输出,通常为屏幕输出。
 2 cout<<表达式<<表达式...
 3 I/O流类库中提供了一些操作符,要使用操作符,首先必须在源程序的开头包含iomanip头文件。
 4 dec 数值数据采用十进制表示
 5 hex 数值数据采用十六进制表示
 6 oct 数值数据采用八进制表示
 7 ws 提取空白符
 8 endl 插入换行符,并刷新流
 9 ends 插入空字符
10 setprecision(int)设置浮点数的小数位数(包括小数点)
11 setw(int)设置域宽
12 算法的基本控制结构有三种:顺序结构、选择结构、循环结构。与c语言基本相同。
13 顺序结构详见坐牢第三天;
14 选择结构详见坐牢第四天、第五天;
15 循环结构详见坐牢第六天、第七天。
16 类型别名typedef基本方法详见坐牢第十三天。
17 c艹标准中引入auto类型说明符,以便让编译器替我们分析表达式所属的类型,auto让编译器通过初始值自动推断变量的类型。显然,定义auto变量必须要有初始值。
18 在某些情况下,我们定义一个变量与某一表达式的类型相同,但并不想用该表达式初始化这个变量,这时需要decltype变量,它的作用是选择并返回操作数的数据类型。在此过程中编译器分析表达式得到其类型,但没有实际计算表达式的值。使用decltype时需要紧跟一个圆括号,圆括号内为一个表达式,声明的变量与该表达式类型一致。
19 一个decltype变量声明的例子如下:
20 decltype(i) j=2;
21 上述声明表示j以2作为初始值,类型与i一致。
数据的输入输出
复制代码
#include<iostream>//#include被称为预处理指令,文件iostream中声明了程序所需要的输入和输出操作有关的信息。
using namespace std;//针对命名空间的指令,关于命名空间的概念,编写简单程序时只要嵌入iostream文件之后即可。
int main(){//main是主函数名,函数体用一对花括号包围。函数是C++程序中最小的功能的单位,在C++程序中,必须有且只能有一个名为main的函数,它表示程序执行的开始点。main函数之前的int表示main函数的返回值类型。程序由语句组成,每条语句由分号(;)作为结束符。
    cout<<"Hello!"<<endl;//cout是一个输出流对象,它是C++系统预定义的对象,其中包含了许多有用的输出功能。endl表示一个换行符。
    cout<<"Welcome to C++!"<<endl;//输出操作由操作符“<<”表达,其作用的将紧随其后的双引号中的字符串输出到标准输出设备(多数系统默认输出设备是显示器)上。
    return 0;//表示退出main函数并以0作为返回值,通常用main函数的返回值是0表示程序正常结束,可以用返回非0值表示程序非正常结束。
}
使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。

答案: 对。

预定义的插入符从键盘上接收数据是不带缓冲区的。

答案:错。

使用操作符setw对数据进行格式输出时,需要包含()文件。
A.iostream.h

B.fstream.h

C.iomanip.h

D.stdlib.h

答案:C

体会:详见数据的输入输出加号。

cout 是由I/O 流库预定义的( )。
A.类

B.对象

C.包含文件

D.常量

答案:B

体会:详见数据的输入输出加号。

复制代码
分析以下程序:程序的输出结果是

#include <iostream>
using namespace std;
void fun(int num)
{
    cout << num << endl;
}
void fun(char ch)
{
    cout << (ch + 1) << endl;
}
int main()
{
    fun('A');
    return 0;
}
A.65

B.66

C.A

D.B
复制代码

答案:B

 体会:由此图可知调用的第二个函数 ,char的存储本质为ascll码,char类型做运算会转为整型,编译器最后当做整型处理。

编程题

复制代码
7-1 2017Final 圆周率山
分数 10
作者 何振峰
单位 福州大学
为了参加学校的社团风采展,怡山小学数学组的同学们决定画一座圆周率山,以宣传圆周率。

已知圆周率为:3.

1415926535 8979323846 2643383279 5028841971 6939937510

5820974944 5923078164 0628620899 8628034825 3421170679

8214808651 3282306647 0938446095 5058223172 5359408128

4811174502 8410270193 8521105559 6446229489 5493038196

输入格式:
输入山的高度,为一个不超过10的正整数。

输出格式:
以上尖下宽,左右对称的三角形形式,给出圆周率的前若干位(不含小数点)。注意:每行均以数字结尾,即数字右边无空格。

输入样例1:
1
输出样例1:
3
输入样例2:
4
输出样例2:
   3
  141
 59265
3589793
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
问题描述
复制代码
复制代码
 #include<iostream>
  #include<string>
  #include<iomanip>
  #define PI "314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"
  using namespace std;
 int main()
 {    
      string str(PI);            //初始化字符串
     int height,weight,mark(0);        //height为高度,weight为底层的宽度,mark用于记录截取字符串的位置
    cin>>height;                    //输入高度
     weight=height*2-1;                //计算底层宽度
     string *p=new string[height];    //动态分配字符串组
for(int i(0);i<height;i++)        //将字符串分层,每层有2*i+1个字符
     {
         *(p+i)=str.substr(mark,i*2+1);        //sting.substr(unsigned int pos, unsigned int n) 从字符串sting的下标为pos的字符开始,截取n个字符
         mark+=(i*2+1);
     }
     for(int i(0);i<height;i++)                //分层输出
     {
         cout<<setw(weight/2+i+1)<<setfill(' ')<<*(p+i)<<endl;        //每层占位wight/2+i+1个字符位,输出每层的字符串,其他的由空格填充
     }
     return 0;
 
复制代码

第三章 函数 作业三 函数

3.1~3.4与c语言基本相同详见坐牢第八天。

复制代码
1 C++语言中提供了对函数重载的支持,使人们在编程时可以对不同的功能赋予相同的函数名,编译时会根据上下文(实参的类型和个数)来确定使用哪一具体功能。
2 两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数重载。
3 c艹允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。
4 不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解、混淆。
5 当使用具有默认形参值的函数重载形式时,需要注意防止二义性。
函数重载
复制代码
在C++中,关于下列设置缺省参数值的描述中,()是正确的。
A.不允许设置缺省参数值;

B.在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;

C.只能在函数的定义性声明中指定参数的缺省值;

D.设置缺省参数值时,必须全部都设置;

答案:B

体会:所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数,即:带缺省值的参数必须放在参数表的最后面。 缺省值必须是常量。显然,这限制了缺省参数的数据类型,例如动态数组和界面类型的缺省参数值只能是 nil;至于记录类型,则根本不能用作缺省参数。 缺省参数必须通过值参或常参传递。声明是带有缺省参数的函数,则缺省值只能写在声明当中。

缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数。
使用地址作为实参传给形参,下列说法正确的是()
A.实参是形参的备份

B.实参与形参无联系

C.形参是实参的备份

D.实参与形参操作的是同一对象
答案:D
复制代码
下面程序的运行结果是

#include<iostream>
using namespace std;

void fun(int * a, int * b) {
    int x = *a;
    *a = *b;
    *b = x;
    cout << *a << *b << " ";
}
int main() {
    int x = 1, y = 2;
    fun(&x, &y);
    cout << x << y << endl;
    return 0;
}

A.12 12

B.12 21

C.21 12

D.21 21
复制代码
答案:D
体会:以引用的方式传参,形参通过虚实结合成为实参的一个别名,对形参的任何操作也就会直接作用域实参。
复制代码
当一个函数功能不太复杂,但要求被频繁调用时,选用____。

A.重载函数

B.内联函数

C.递归函数

D.嵌套函数
复制代码
答案:B
体会:对于一些功能简单、规模较小又使用频繁的函数,可以设计为内联函数。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。这样就节省了参数传递、控制转移等开销。内联函数在定义与普通函数的定义方式几乎一样,只是需要使用关键字inline,其语法形式如下:
inline 类型说明符 函数名(含类型说明的形参表)
{
  语句序列
}
如果将一个复杂的函数定义为内联函数。反而会造成代码膨胀,增大开销。这种情况,多数编译器都会自动将其转换为普通函数来处理。
复制代码
重载函数在调用时选择的依据中,错误的是(  )

A.函数的参数

B.参数的类型

C.函数的名字

D.函数的类型
复制代码
答案:D

函数题

复制代码
6-1 引用作函数形参交换两个整数
分数 10
作者 李廷元
单位 中国民用航空飞行学院
设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。

裁判测试程序样例:
#include <iostream>
using namespace std;

/* 请在这里填写答案 */

int main()
{
    int a, b;

    cin >> a >> b;

    Swap(a, b);

    cout << a << " " << b << endl;

    return 0;
}
输入样例:
3 5
输出样例:
5 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
问题描述1
复制代码
void Swap(int &a,int &b)
{
    int t;
    t=a;
    a=b;
    b=t;
}
复制代码
6-2 逆序字符串
分数 10
作者 李廷元
单位 中国民用航空飞行学院
设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序。例如,给定字符串为“hello”,逆序后为“olleh”。
###函数接口定义如下:

/* 函数原型参见main函数 */
###裁判测试程序样例:

#include <iostream>
#include <string>
using namespace std;

/* 你的代码将嵌在这里 */

int main(int argc, char const *argv[])
{
    string str;
    getline(cin, str);        //输入字符串
    reverse_string(str);     //逆序字符串str
    cout << str << endl;    //输出逆序后的字符串
    return 0;
}
###输入样例:

hello
###输出样例:

olleh
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
问题描述2
复制代码
复制代码
void reverse_string(string &str)
{
    char *p = &str[0];
    int i = 0;
    while(*p)
    {
        p++;
        i++;
    }
    char a;
    p--;
    i--;
    for(int j = 0;i>j;i--,j++)
    {
        a=str[i];
        str[i]=str[j];
        str[j]=a;
        
    }
}
复制代码
复制代码
6-3 面积计算器(函数重载)
分数 10
作者 何振峰
单位 福州大学
实现一个面积计算器,它能够计算矩形或长方体的面积。

函数接口定义:
int area(int x, int y);
int area(int x, int y, int z);
第一个函数计算长方形的面积,其中x和y是长和宽。第二个函数计算长方体的表面积,x,y和z是长,宽和高。

裁判测试程序样例:
#include<iostream>
#include<string>
using namespace std;
int area(int,int);
int area(int,int,int);
int main()
{
    int i, repeat, c, x, y, z;
    cin>>repeat;
    for(i=0;i<repeat;i++){
        cin>>c;
        if(c==2){
            cin>>x>>y;
            cout<<area(x,y)<<endl;
        }
        if(c==3){
            cin>>x>>y>>z;
            cout<<area(x,y,z)<<endl;
        }
    }
    return 0;
}

/* 请在这里填写答案 */
输入样例:
2
2 1 2
3 2 3 4
输出样例:
2
52
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
问题描述3
复制代码
int area(int x, int y)
{
    return x*y;
}
int area(int x, int y, int z)
{
    return (x*y+x*z+y*z)*2;

 第六章 数组、指针与字符串 

数组基本内容详见坐牢第十天
复制代码
1 数组的元素不仅可以是基本数据类型,也可以是自定义类型。
2 对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。
3 如果需要建立某个类的对象数组,在设计类的构造函数时就要充分考虑到数组元素初始化的需要:当个元素对象的初值要求为相同的值时,应该在类中定义默认构造函数;当各元素对象的初值要求为不同的值时,需要定义带形参(无缺省值)的构造函数。
4 当一个数组中的元素对象被删除时。系统会调用析构函数来完成扫尾工作。
对象数组
复制代码
指针基本内容详见坐牢第十一天
复制代码
 1 虽然对象是同时包含了数据和函数两种成员,与一般变量略有不同,但是对象所占据的内存空间只是用于存放数据成员的,函数成员不在每一个对象中存储副本。
 2 对象指针就是用来存放对象地址的变量。
 3 this指针是一个隐含于每一个类的非静态成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象。
 4 this指针实际上是类成员函数的一个隐含参数。在调用类的成员函数时。目的对象的地址会自动作为该参数的值,传递给被调用的成员函数,这样被调函数能够通过this指针来访问目的对象的数据成员。对于常成员函数来说,这个隐含的参数是常指针类型的。
 5 this指针明确地指出成员函数当前所操作的数据所属的对象。
 6 实际过程是,this指针是成员函数的一个隐含形参,当通过一个对象调用成员函数时。系统先将该对象的地址通过该参数传递给成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。
 7 对类成员取地址时,也要遵守访问权限的约定,也就是说,在一个类的作用域之外不能够对它的私有成员取地址。
 8 访问数据成员时,这种结合方式可通过以下两种语法形式实现:
 9 对象名.* 类对象指针名
10 或 对象指针名->*类成员指针名
11 成员函数指针在声明之后要用以下形式的语句对其赋值:
12 指针名=&类名::函数成员名;
13 常成员函数与普通成员函数具有不同的类型,因此能够被常成员函数赋值的指针,需要在声明时明确写出const关键字。
14 对类静态成员的访问是不依赖于对象的,因此可以用普通的指针来指向和访问静态成员。
对象指针
复制代码
复制代码
1 在C++中,动态分配技术可以保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放,这种在程序运行过程中申请和释放的存储单元也称为堆对象,申请和释放过程一般称为建立和删除。
2 运算符new的功能是动态分配内存,或者称为动态创建堆对象,语法形式为:
3 new 数据类型(初始化参数列表);
4 该语句在程序运行过程中申请分配用于存放指定类型数据的内存空间,并根据初始化参数列表中给出的值进行初始化。如果内存申请成功,new运算便会返回一个指向新分配内存首地址的类型的指针,可以通过这个指针对堆对象进行访问;如果申请失败,会抛出异常。
5 运算符delete用来删除由new建立的对象,释放指针所指向的内存空间,格式为:
6 delete 指针名;
7 如果被删除的是对象,该对象的 析构函数将被调用。对于用new建立的对象,只能使用delete进行一次删除操作,如果对同一内存空间多次使用delete进行删除将会导致运行错误。
8 用new分配的内存。必须用delete加以释放,否则会导致动态分配的内存无法回收,使得程序占据的内存越来越大,这称为“内存泄露”。
动态内存分配
复制代码
字符串基本内容详见坐牢第十天
复制代码
1 string类并非一个独立的类,而是类模板basic_string的一个特殊化实例。
2 string类提供丰富的操作符,可以方便地完成字符串赋值、字符串连接、字符串比较等功能,之所以能够使用 操作符来操作string对象,是因为string类对这些操作符进行了重载。
3 直接使用cin的“>>”操作符从键盘中输入字符串,以这种方式输入时,空格会被作为输入的分隔符。
4 如果希望从键盘读入字符串,直到行末为止,不以中间的空格作为输入的分隔符,可以使用头文件string中定义的getline。
string类
复制代码
x 和 y 均为 bool 量,则 x && y 为真的条件是( )。
A.x 和 y 均为真

B.x 和 y 有一个为真

C.x 和 y 均为假

D.x 和 y 有一个为假
答案:A
复制代码
设int x;,则经过()后,语句*px=0;可将x值置为0。

A.int * px;

B.int const * px=&x;

C.int * const px=&x;

D.const int * px=&x;
复制代码

答案:C

体会:B int const * px=&x;定义了一个常量指针,C int * const px=&x;为指针常量 指针常量的值是指针,这个值因为是常量,所以不能被赋值。虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。

const int *p说明不能修改()。
A.p指针;

B.p指针指向的变量;

C.p指针指向的数据类型;

D.上述A、B、C三者;
答案:B
对于常数据成员,下面描述正确的是:
A.常数据成员可以不初始化,并且不能更新

B.常数据成员必须被初始化,并且不能更新

C.常数据成员可以不初始化,并且可以被更新

D.常数据成员必须被初始化,并且可以更新
答案:B
下列说法中正确的是( )
A.在函数参数定义中可以使用const说明符,其值在函数体内不可改变

B.在函数参数定义中可以使用const说明符,但必须指定缺省值

C。在函数参数定义中可以使用const说明符,但只能有一个参数使用const

D.在函数参数定义中不可以使用const说明符
答案:A
复制代码
f()函数是类的一个常成员函数,它有一个int型参数,并且返回类型为int。下列对该常成员函
数进行声明的选项中,正确的是( )
A.int f(int)const;

B.const int f(int);

C.int f(const int);

D.const int f(const int);
复制代码
答案:A 

总结:c++在c语言面向过程的方法上加入面向对象程序设计,自定义数据类型得到强化,以上知识都在c语言的基础上得到升华。

↓我删不掉了就留着吧....

复制代码
 1 R进制中的数使用0~(R-1)个数字符号。
 2 采用二进制码表示信息,有如下几个优点:1)易于物理实现2)二进制数运算简单3)机器可靠性高4)通用性强。
 3 信息的单位通常采用“位”“字节”“字”:
 4 位(bit):度量数据的最小单位,表示1位二进制信息。
 5 字节(byte):一字节由8位二进制数字组成(1byte=8bit)。字节是信息存储中最常见的基本单位。计算机的存储器(包括内存和外存)通常也是以多少字节来表示它的容量。
 6 字(word):字是位的组合,并作为一个独立的信息单位处理。字又称计算机字,它的含义取决于机器的类型、字长以及使用者的要求。常用的固定字长有8位、16位、32位、64位等。
 7 机器字长:在讨论信息单位时,还有一个与机器硬件指标有关的单位,这就是机器字长。机器字长一般是指参加运算的寄存器所含有的二进制数的位数。
 8 数有正负之分,一般情况,用0表示正号,1表示符号,符号位放在数的最高位。
 9 为了改进符号数的运算方法和简化运算器的硬件结构,人们研究了符号数的多种二进制编码方法,其实是对负数表示的不同编码。
10 原码,将符号位数字化为0或1,数的绝对值与符号一起编码,即所谓“符号—绝对值表示”的编码称为原码。“[X]原”就是机器数,X称为机器数的真值。当采用原码表示法时,编码简单直观,与真值转换方便。但原码也存在一些问题,一是零的表示不唯一,二是用原码进行四则运算时,符号位需单独处理,且运算规则复杂。
11 反码,正数的反码与原码表示相同。负数反码的符号位与原码相同(仍用1表示),其余各位取反(0变1,1变0)。
12 补码,对于一个负数,其补码由该数反码的最末位加1求得。
13 对于正数来说,其原码、反码、补码形式相同。
14 符号位可作为数值参加运算,补码运算的结果仍为补码。
信息的表示与存储
复制代码
posted @   寒心小呆  阅读(449)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示