c++学习总结(持续更新)
文章目录
时间:2023寒假
学习书籍:《c++ Primer Plus》
1.预备知识
1.1c++简介
c++融合了三种不同的编程方式:C语言代表的过程性语言。c++在C语言基础上添加的类代表的面向对象语言,c++模板支持的泛型编程。
名称c++来源于c语言中的递增运算符++,该运算符将变量加一,名称c++表明,它是c的扩充版本
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度
的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object
oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语
言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语
言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程
序设计。
2.开始学习c++
2.1进入c++
使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码
#include<iostream>
int main()
{
using namespace std;
cout<<"Come up and C++ me some time.";
cout<<endl;
cout<<"you won't regret it!"<<endl;
return 0;
}
#include该编译指令导致预处理器将iostream文件的内容添加到程序中
iostream中的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)
注意:使用cin和cout进行输入和输出的程序必须包含文件iostream
c++版本的math.h为cmath
2.1.2名称空间
using namespace std;
这叫做using编译指令
在iostream中定义的用于输出的cout变量实际是std::cout,而endl实际上是std::endl.
因此,可以省略编译指令using
std::cout<<"Come up and C++ me some time.";
std::cout<<std::endl;
2.1.3使用cout等知识
cout<<“Come up and C++ me some time.”;
<<表示该语句将把这个字符串发送给cout
endl表示:重起一行
诸如endl等对于cout来说有特殊意义的特殊符号被称为控制符(manipulator)打印字符串时,cout不会自动移到下一行
\n与endl的差别在于endl确保程序继续运行前刷新输出(将其立即显示在屏幕上)
2.2c++语句
#include<iostream>
int main()
{
using namespace std;
int carrots;
cout <<"How many carrots do you have ?"<<endl;
cin>>carrots;
cout<<"Here are two maor.";
carrots = carrots +2;
cout<<"Now you have "<<carrots<<" carrots."<<endl;
return 0;
}
cin>>carrots;
从这条语句可知,信息从cin流向carrots
cin是一个C++标准的输入流对象。
cin代表标准输入设备,使用右移运算符 “>>” 从设备键盘取得数据,送到输入流对象cin中,然后送到内存。使用cin可以获得多个从键盘的输入值,其具体使用格式如下:
cin >> 表达式1 >>表达式2…>> 表达式n;
cout<<"Now you have "<<carrots<<" carrots."<<endl;
相当于
cout<<"Now you have "
cout <<carrots;
cout <<" carrots.";
cout <<endl;
cout<<"Now you have "
<<carrots
<<" carrots."
<<endl;
类描述了一种数据类型的全部属性(包括可使用它执行的操作),对象是根据这些描述创建的实体。
在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。
类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。
上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。
学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。
2.4函数
参数是发送给函数的信息,返回值是从函数中发送回去的值
函数原型与函数定义
原型只描述函数接口,也就是说,它描述的是发送给函数的信息和返回的信息,而定义中包含了函数的代码,如计算平方根的代码,库文件中包含了函数的代码,而头文件中则包含了原型。
有些函数接受多项信息,这些函数使用多个参数,参数间用逗号分开
#include<math.h>
pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值实际上为double型 ,其在使用中的原型为:double pow(double x, double y);
注意,在某些特定的情况之下,pow函数的double类型可能会引起输出结果的错误
.pow()用来计算以x 为底的 y 次方值,然后将结果返回。设返回值为 ret
则 ret = x^y
另外一些函数不接受任何参数
c++不允许将函数定义嵌套在另一个函数定义中
main()的返回值是返回给操作系统
通常的约定是,退出值为0则意味着程序执行成功,为非零则意味着存在问题
C++98/03 关键字
ISO C++98/03关键字共63个,此处严格按标准原文排版:
asm
do
if
return
typedef
auto
double
inline
short
typeid
bool
dynamic_cast
int
signed
typename
break
else
long
sizeof
union
case
enum
mutable
static
unsigned
catch
explicit
namespace
static_cast
using
char
export
new
struct
virtual
class
extern
operator
switch
void
const
false
private
template
volatile
const_cast
float
protected
this
wchar_t
continue
for
public
throw
while
default
friend
register
true
delete
goto
reinterpret_cast
try
3.处理数据
3.1简单变量
标识符命名规则
作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则
标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或者下划线
标识符中字母区分大小写
全局名称指的是名称被声明的位置
C++规定在创建一个变量或者常量的时候,必须要指定出相应的数据类型,否则无法给该变量分配内存空间
sizeof关键字
作用:统计数据类型所占空间的大小。
语法:
sizeof(数据类型/变量);对类型名使用sizeof运算符时,应将名称放在括号中,但对变量名使用该运算符,括号是可选的
cout<<"int is"<<size of(int)<<"bytes.\n";
cout<,"short is"<<sizeeof n_short<<"bytes.\n";
符号常量 | 表示 |
---|---|
CHAR_BIT | char的位数 |
CHAR_MAX | char的最大值 |
CHAR_MIN | char的最小值 |
SCHAR_MAX | signed char的最大值 |
SCHAR_MIN | signed char的最小值 |
C++ 标准头文件climits中的符号常量(以上仅为少数,难得打了
)
初始化
int owls=101;//traditional C initialization,sets owls to 101
int wrens(432); //alternative c++ syntax,set wrens to 432
int hamburgers ={24};
#include<iostream>
int main()
{
using namespace std;
char ch ='M';
int i = ch;
cout<<"The asc11 code for"<<ch<<"is"<<i<<endl;
cout<<"Add one to the character code:"<<endl;
ch = ch+i;
i = ch;
cout<<"The asc11 code for"<<ch<<"is"<<i<<endl;
cout<<"Displaying char ch using cout.put(ch):";
cout.put(ch);
cout.put('!');
cout<<endl;<<"Done"<<endl;
return 0;
}
cout.put
【实例1】输出单个字符 a。
cout.put(‘a’);
调用该方法的结果是在屏幕上显示一个字符 a。
【实例2】put() 函数的参数可以是字符或字符的 ASCII 代码(也可以是一个整型表达式)。
cout.put(65 + 32);
cout.put(97);
上面两行代码都输出字符 a,因为 97 是字符 a 的 ASCII 代码。
【实例3】可以在一个语句中连续调用 put() 函数,例如:
cout.put(71).put(79).put(79). put(68).put(‘\n’);
在屏幕上显示GOOD。
【实例4】有一个字符串 “ten.gnehcnaib.c//:ptth”,要求把它们按相反的顺序输出。
#include <iostream>#include <string>using namespace std;int main(){ string str = "ten.gnehcnaib.c//:ptth"; for (int i = str.length() - 1; i >= 0; i--) { cout.put(str[i]); //从最后一个字符开始输出 } cout.put('\n'); return 0;}
运行结果:
http://c.biancheng.net
所有的转义字符和所对应的意义:
转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\ 代表一个反斜线字符’‘’ 092
’ 代表一个单引号(撇号)字符 039
" 代表一个双引号字符 034
? 代表一个问号 063
\0 空字符(NUL) 000
\ddd 1到3位八进制数所代表的任意字符 三位八进制
\xhh 十六进制所代表的任意字符 十六进制
注意:区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换
wchar_t是C/C++的字符类型,是一种扩展的存储方式。wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。
统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
统一码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
“char8_t、char16_t和char32_t类型分别表示 8 位、16 位和 32 位宽字符
布尔类型bool
作用:布尔类型数据代表真或假的值。
bool类型只有两个值:
true——真(1)
false——假(0)
bool类型占1个字节大小
3.2const限定符
与#define相比,首先,它能够明确指定类型。其次,可以使用c++的作用域规则将定义限制在特定的函数或文件中(作用域规则描述了名称在各种模块中的可知程度)。最后,可以将const用于更复杂的类型
3.3浮点数
3.45E6 这指的是3.45与1000000相乘的结果。E6指的是10的6次方,即1后面6个0,6被称为指数,3.45被称为尾数(也可使用e)然而,数字中不能有空格,指数为负数意味着除以10的乘方,因此,8.33E-4表示8.33/10**101010,即0.000833
d.dddE+n指的是将小数点向右移n位,而d.dddE-n指的是将小数点向左移n位。之所以成为“浮点数“,就是因为小数点可移动
setf 使用方法(暂时不懂)
3.4c++算术运算符
(long)thorn
long(thorn)
强制类型转换不会修改thron变量本身,而是创建一个新的,指定类型的值,可以在表达式中使用这个值
强制转换的通用格式如下
(typeName)value
typeName(value)
第一种格式来自C语言,第二种格式是纯粹的c++,新格式的想法是,要让强制类型转换就像是函数调用。这样对内置类型的强制类型转换就像是为用户定义的类设计的类型转换。
3.5总结
4.复合类型
4.1数组
4.2字符串
4.3string类简介
4.4结构简介
4.5共用体
4.6枚举
5.循环和关系表达式
最后
应用
1.猜数字游戏
#include<iostream>
using namespace std;
#include<ctime>
int main()
{
srand((unsigned int)time(NULL));//添加随机数种子,作用:利用当前系统生成随机数
int num = rand() % 100 + 1; //系统生成随机数
int val = 0;
while (1)
{
cin >> val;
if (val > num)
{
cout << "猜测过大" << endl;
}
else
if (val < num)
{
cout << "猜测过小" << endl;
}
else
{
cout << "恭喜猜对了" << endl; break;
}
}
}
rand()%m这个函数是随机产生0到m-1的随机数;比如rand()%10就是随机产生0到9的随机数。
使用C语言的rand函数,生成的是伪随机数;
2.水仙花数
#include<iostream>
using namespace std;
int main()
{
int num = 100;
do
{
int a =0; //个位
int b = 0; //十位
int c = 0; //百位
a = num%10;
b = num/10%10;
c=num /100;
if(a*a*a + b*b*b +c*c*c ==num)
{
cout<<num<<endl;
}
num++;
}
while(num<1000);
system("pause");
return 0;
}
3.练习案例:敲桌子
案例描述:从1开始数到数字100, 如果数字个位含有7,或者数字十位含有7,或者该数字是7的倍数,我们打印敲桌子,其余数字直接打印输出。
#include<iostream>
using namespace std;
int main()
{
for(int i =1;i<=100;i++)
{
if(i%7 ==0 || i%10 ==7 ||i /10 ==7)
{cout<<"敲桌子"<<endl;}
else
{
cout<<i<<endl;
}
}
system("pause");
return 0;
}
4.**练习案例:**乘法口诀表
#include<iostream>
using namespace std;
int main()
{for(int i =1;i<=9;i++)
{
for(int j =1;j<=i;j++)
{
cout<<j<<"*"<<i<<"="<<j*i<<" ";
}
cout<<endl;
}
system("pause");
return 0;}
mespace std;
int main()
{
for(int i =1;i<=100;i++)
{
if(i%7 ==0 || i%10 ==7 ||i /10 ==7)
{cout<<“敲桌子”<<endl;}
else
{
cout<<i<<endl;
}
}
system(“pause”);
return 0;
}
4.**练习案例:**乘法口诀表
```c++
#include<iostream>
using namespace std;
int main()
{for(int i =1;i<=9;i++)
{
for(int j =1;j<=i;j++)
{
cout<<j<<"*"<<i<<"="<<j*i<<" ";
}
cout<<endl;
}
system("pause");
return 0;}
[外链图片转存中…(img-5SK1b6cE-1676030326202)]