目录
1.C++语言简介
1.C++语言发展简史
1.机器语言
2.汇编语言
3.高级语言
4.C++语言发展简史
5.C++和C语言的关系
2.C++语言的特点
1.基本的输入输出
1.C++中的输入流和输出流
2.标准的hellworld代码
3.简单的输输出函数
2.头文件和命名空间
1.头文件
2.命名空间
3.强制类型转换运算符
1. static_cast
2.const_cast
4.函数参数的默认值
5.引用和函数参数的传递
1.引用
2.引用在函数中的使用
6.const与指针共同使用
7.内联函数
8.函数的重载
9.指针和动态内存分配
1.指针
2.动态内存分配
10.用string对象处理字符串
1.声明string对象
2.string对象的操作
1.输入输出
2.string对象之间互相赋值
3.使用运算符操作
4.使用+进行字符串拼接
5.string对象用法实例
1.empty()函数判断字符窜是否为空
2.size()函数判断字符的大小
3.length()函数判断字符窜长度
4.find()函数
5.insert()函数
6.append()函数
3.C++语言的程序结构
工作之后,没怎么写过C++了,空闲下来的时候,翻了下C++的书籍,记录下学习C++的过程。
1.C++语言简介
1.C++语言发展简史
按照是否可以直接操纵计算机底层硬件,把程序设计语言分成低级语言、中级语言、高级语言。机器语言和汇编语言属于低级语言,因为它们可以直接操纵计算机的寄存器和内存。计算机诞生的初期,使用低级语言编程是主要的开发形式。
1.机器语言
机器语言是一种依赖于CPU的指令系统,使用机器指令的二进制代码编写程序,能够直接被计算机识别。
2.汇编语言
汇编语言使用能够代表指令的助记符来编写程序,也可以看作是符号化了的机器语言。
3.高级语言
高级语言是面向用户的语言,在形式上接近于算数语言和自然语言。优点是程序容易阅读并且通用性强,但是不能直接和硬件打交道,可不能直接在计算机上运行,需要系统软件的支持,需要编译程序以及链接程序将高级语言编译链接称为及其指令之后才能运行。
C++属于高级语言范畴。
4.C++语言发展简史
- 1979年C++诞生于贝尔实验室。
- 1985年C++1.0版诞生。
- 1989年C++2.0版诞生。
- 1993年C++3.0版诞生。
- 1998年C++98(C++标准第一版)诞生。
- 2003年C++03(C++标准第二版)版诞生。
- 2011年C++11(C++标准第三版)版诞生。
- 2014年C++14(C++标准第四版)版诞生
- 2017年C++17(C++标准第五版)版诞生。
5.C++和C语言的关系
C语言是C++的前身,在进一步扩充和完善C语言的基础上得到了C++语言。C++是C语言的超集。
2.C++语言的特点
C++语言的主要特点如下:
- C++是C语言的继承,尽量兼容C语言,既保持了C语言的简洁和高效,可以像C语言那样进行结构化程序设计,同时也增强了C语言对类型的处理。
- C++加入了面向对象特征,可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行一继承和多态为特点的面向对象的程序设计。
1.基本的输入输出
1.C++中的输入流和输出流
C++中,类库中提供了输入流instream和输出流ostream。cin和cout分别是instream类和ostream类的对象,用来实现基本的键盘输入和屏幕输出。
从输入流中获取数据的操作称为提取操作,向输出流中添加数据的操作称为插入操作。运算符">>"和"<<"是位移运算符,在C++类库中已经对"<<"和">>"进行了重载,使之分别作为流提取运算符和流插入运算符,用来输入和输出C++标准类型的数据。
在使用cin和cout函数的时候,必须导入<iostream>.
C++中,当连续从键盘读取想要的数据时,以空格<Space>,制表符<Tab>,或者<Enter>键作为分隔符。
cin的一本格式如下:
cin>>变量1>>变量2>>..>>变量n;
cout的一本格式如下:
cout<<变量1<<变量2<<..<<变量n;
cout的一本格式如下:
2.标准的hellworld代码
#include <iostream>int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";return 0;
}
3.简单的输输出函数
cout的一本格式如下:
#include <iostream>int main(int argc, const char * argv[]) {// insert code here...std::cout <<"请输入两个整数\n";int numbber1, number2;std::cin>>numbber1>>number2;std::cout <<"number1:"<<numbber1<<"\tnumnber2:"<<number2<<"\n";return 0;
}
2.头文件和命名空间
1.头文件
C++中使用#include指令表示导入类库或者头文件。
其中#include<文件名>表示导入系统提供的类库,#include "文件名"表示导入用户自定义的类文件。 当我们使用尖括号的时候,C++编译器首先寻找C++设置的目录中寻找头文件,如果找不到,才会在制定的目录中寻找。
常用的头文件有以下几个:
- 标准输入输出流:<iostream>
- 标准文件流:<fstream>
- 标准字符串处理函数:<string>
- 标准数学函数:<cmath>
2.命名空间
C++使用namespace表示命名空间。
标准的namespace格式如下:
namespace 命名空间名
{
命名空间内的各种声明(函数声明、类声明、...)
}
C++中namespace的引入是为了解决不同模块中出现的标识符重名的问题,在大型的程序中,各个模块通常是不同的程序员开发的,不同模块中可能会出现重名的问题,namespace的引用就解决了这个问题。
引用命名空间的标识符的语法格式如下:
命名空间名::标识符;
using namespace 命名空间名;
第一种方式表示在本文件中直接使用该标识符
第二种方式表示可以再本文件中直接使用指定命名空间内的所有标识符。
以上面的helloworld程序为例,当我们使用using namespace ::std定义标识符的时候,std::cout<<"Hello world!"可以写成"cout<<"Hello world".
#include <iostream>
using namespace::std;int main(int argc, const char * argv[]) {// insert code here...cout <<"Hello world!\n";return 0;
}
3.强制类型转换运算符
当不同类型的量进行混合运算时,系统自动进行合理的类型转换,也可以在程序中使用强制类型转换符static_cast或者是const_cast进行转换。
1. static_cast
static_cast表示将一种数据类型转换成另外一种数据类型,使用格式如下:
static_cast<类型名>(表达式)
其中static_cast可以省略,下面的四种写法都是正确的
oneInt2 = static_cast<Int>(oneDouble)
oneInt2 = Int(oneDouble)
oneInt2 = (Int)oneDouble
oneInt2 = oneDouble
2.const_cast
用于去除指针和引用的常量性,但不能去除变量的常量性。
标准格式如下:
const_cast<类型名>(表达式)
这个运算符的作用就是讲常量指针转换为非常量的指针,并且仍然指向原来的对象;或者将常量引用转换成为非常量的引用,并且仍然指向原来的对象。
4.函数参数的默认值
C++中,可以再声明函数时为形参指定默认值。当调用默参数值的函数时,调用语句中可以不给出对应的实参,这就相当于调用该函数时以默认值作为参数。指定默认值时不仅可以用常数,还可以用任何有定义的表达式作为参数的默认值。
#include <iostream>
using namespace::std;void func(int a = 11,int b = 22,int c = 33){cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
}int main(int argc, const char * argv[]) {func();func(55);func(77,99);func(8,88,888);return 0;
}
上述的代码中,我们调用func()的时候,打印出来的结果是11,22,33
调用func(55)的时候,打印出来的结果是55,22,33。
调用func(77,99)的时候,打印出来的结果是77,99,33。
调用func(8,88,888)的时候,打印出来的结果是8,88,888。
5.引用和函数参数的传递
1.引用
引用相当于给变量起了一个别名,格式如下:
类型名 & 引用名 = 同类型的某变量
如果给变量起了一个别名,相当于变量和这个引用都对应到同一地址。
int oneInt;
int &aname = oneInt;
2.引用在函数中的使用
函数在传值的时候既可以直接传值,也可以传指针。
6.const与指针共同使用
const限制访问权限,告诉编译器,它所修饰的量是不能改变的。
const修饰变量的时候,基本含义如下:
1.如果唯一的const位于符号*的左侧,表示指针所指数据是常量,数据不能通过本指针修改,但是可以通过其他方式进行修改;指针本身是变量,可以指向其他的内存单元。
2.如果唯一的const位于符号*的右侧,表示指针本身是常量,不能让该指针指向其他内存地址;指针所指的数据可以通过本指针修改。
3.如果符号*的左右两侧各有一个const的时候,表示指针和指针所指数据都是常量,既不能让该指针指向其他地址,也不能通过指针修改所指的数据。
7.内联函数
C++中内联函数的使用是为了减少程序代码,实现程序代码的共享,从而提高程序的开发效率和可维护性。
内联函数的标准格式:
inline 返回值类型 函数名(函数参数)
{函数体
}
8.函数的重载
C++允许同名的重载函数。
#include <iostream>
#include <string>
using namespace::std;int max(int x,int y){if (x>=y) {return x;} else {return y;}
}
float max(float x,float y){if (x>=y) {return x;} else {return y;}
}
double max(double x,double y){if (x>=y) {return x;} else {return y;}
}int main(int argc, const char * argv[]) {string str = "C++";str = str.append("程序设计");cout<<str<<endl;cout<<max(1, 3)<<endl;cout<<max(1.1, 3.0)<<endl;cout<<max(111.123123123123, 3.123123123123)<<endl;return 0;
}
9.指针和动态内存分配
1.指针
指针变量中保存的事一个地址,有时候指针指向一个地址。
2.动态内存分配
C++中不允许定义元素个数不确定的数组。但是提供了动态内存分配机制,在程序运行期间,根据实际需要,临时分配一段内存空间用于存储数据。因为这种内存分配实在程序运行期间进行的,所以称作”动态内存分配“。
10.用string对象处理字符串
C++标准类库中提供了一个string数据类型,专门用于处理字符串。可以把string看成一个特殊的数据类型,专门用来处理字符串。
使用string对象的时候,必须在程序中包含头文件string,即在程序的最前面,要加入下面的语句:
#include <string>
1.声明string对象
格式如下:
String 变量名;
在声明字符串的同时,可以进行初始化,没有进行初始化的字符串即""。
string str1;
string city = "BeiJing";
string str2= city;
cout<<"str1="<<str1<<"."<<endl;
cout<<city<<","<<str2<<endl;
也可以使用字符串数据对字符串变量进行初始化。例如:
char name[] = "C++程序设计";
string s1 = name;
还可以声明一个string对象数组,即数组中每个元素都是字符串。例如:
string citys[] = {"Beijing","Shanghai","Tianjin","Chongqing"};
cout<<citys[1]<<endl;
cout<<sizeof(citys)/sizeof(string)<<endl;
sizeof(citys)表示整个数组占用的空间大小,sizeof(string)表示每个string对象的大小,所以sizeof(citys)/sizeof(string)表示的是数组元素个数。
2.string对象的操作
1.输入输出
例如:
string s1,s2;
cin>>s1>>s2;
cout<<s1<<","<<s2<<endl;
2.string对象之间互相赋值
string s1,s2="OK";
s1 = "China";
s2 = s1;
cout<<"s1="<<s1<<"\ts2="<<s2<<endl;
3.使用运算符操作
这里指的是对象之间使用"<"、"<="、"=="、">"、">="、"<"运算符进行比较。大小的判定是按照字典的顺序进行的,而且是大小写相关的。例如,大写字母的ASCII码小于小写字母的ASCII码('A'~'Z'码是0x41~0x5a,'a'~'z'码是0x61~0x7a,‘’) ,所以"Zbc"<"abc"。
4.使用+进行字符串拼接
string s1,s2,;
s1 = "C++";
s2 = "程序设计";
s = s1 + s2;
5.string对象用法实例
string类中为字符串对象提供了一些”成员函数“,可以用来方便地实现一些功能。这些成员函数调用方法就是"string对象名.成员函数名(参数)"。
string类中一些常用的成员函数列表如下:
1.empty()函数判断字符窜是否为空
int main(int argc, const char * argv[]) {string str;if (str.empty()) {cout<<"字符串为空\n";} else {}return 0;
}
2.size()函数判断字符的大小
string str = "C++程序设计";cout<<"str字符串的大小:"<<size(str)<<"\n";
3.length()函数判断字符窜长度
string str = "C++程序设计";
cout<<"str字符串的长度:"<<str.length()<<"\n";
4.find()函数
判断字符串中第一次出现字符的位置,如果查到了,范围第一次出现的位置,如果没有查到,返回-1。
string str = "C++程序设计";
if (str.find("C++")!=-1) {
cout<<"C++出现的位置:"<<str.find("C++")<<endl;
} else {
printf("查找失败");
}
运行程序之后,控制台打印:C++出现的位置:0
5.insert()函数
insert函数的作用是在制定的位置增加字符串。
#include <iostream>
#include <string>
using namespace::std;int main(int argc, const char * argv[]) {string str = "程序设计";str = str.insert(0,"c++");cout<<str<<endl;return 0;
}
运行程序之后,控制台输出内容:c++程序设计
6.append()函数
append()函数的作用是在原来字符串的末尾追加新的字符串。
#include <iostream>
#include <string>
using namespace::std;int main(int argc, const char * argv[]) {string str = "C++";str = str.append("程序设计");cout<<str<<endl;return 0;
}
运行程序之后,控制打印:C++程序设计
3.C++语言的程序结构
C++程序以.cpp作为文件拓展名,文件中包含若干个类和若干个函数。程序中必须有且仅有一个主函数main(),这是程序执行的主入口。主函数也成为主程序。程序从主函数的开始出执行,按照其控制结构,一直执行到结束。
程序的结束通常是遇到了以下两种情况之一:
1.在主函数中遇到了return语句
2.执行到主函数最后面的}。
主函数中可以调用程序中定义的其他函数,但其他函数不能调用主函数。主函数仅仅是系统为执行程序时所调用的。
C++程序中,仍然沿用C语言的注释风格,即注释有以下两种形式。
1.从*/开始,到*/结束,这之间的所有内容都视作注释
2.从//直到行尾,都是注释。