1.1 C++简介
四大特性:抽象、封装、继承、多态
数据抽象:一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
数据封装:是一种把数据和操作数据的函数捆绑在一起的机制
标准的 C++ 由三个重要部分组成:
- 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
- C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
- 标准模板库(STL),提供了大量的方法,用于操作数据结构等。
2.1 C++基本语法
C++标识符
C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。
3.1 C++数据类型
C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。C++ 是区分大小写的编程语言。因此,在 C++ 中,Manpower 和 manpower 是两个不同的标识符。
变量的大小会根据编译器和所使用的电脑而有所不同。sizeof(char)测试数据类型大小
typedef声明
typedef type newname
例如下列
typedef int feet;
feet distance
枚举类型
enum color{red,green,blue} c;
c = blue;
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。
enum color { red, green=5, blue };
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。
4.1 C++变量作用域
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。
5.1 C++常量
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
浮点数常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。当使用小数形式表示时,必须包含小数点、指数、或者两者都包含。当使用指数形式时,必须包含整数部分、小数部分、或者同时包含两者。带符号的指数是用e或者E引入的。
定义常量
定义常量在C++中,有两种简单的方式
.使用#define预处理器
.使用const关键字
6.1 C++存储类
C++ 程序中可用的存储类:
- auto
- register
- static
- extern
- mutable
注:for( ; ; ){ }为无限死循环
switch( )中只能为整形或枚举类型
7.1 C++函数
函数参数
调用类型:
传值调用:
指针调用:void swap(int * x,int *y); 调用的话swap(&a,&b);
引用调用
函数声明:void swap(int &x, int &y); 调用的话直接swap(a,b);
参数的默认值
#include <iostream>
using namespace std;
int sum(int a, int b=20){
int result;
result = a + b;
return (result);
}
int main (){
// 局部变量声明
int a = 100;
int b = 200;
int result;
// 调用函数来添加值
result = sum(a, b);
cout << "Total value is :" << result << endl; // 再次调用函数
result = sum(a);
cout << "Total value is :" << result << endl;
return 0;
}
输出分别为:300 120
C++ 随机数
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main(){
int i,j;
//设置种子
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
j=rand();
cout<<"随机数:"<<j<<endl;
}
return 0;
}
8.1 C++数组
指向数组的指针
数组名是一个指向数组中第一个元素的常量指针。
double *p;
double balance[10];
p = balance;
此时的balance[i]==*(p+i)==*(balance+i);
传递数组给函数
c++不允许向函数传递一个完整的数组作为参数,已通过指定不带索引的数组名来传递一个指向数组的指针。
同时函数定义方式有如下几种形式 :
void myFunction(int *param){}
void myFunction(int param[10]){}
void myFunction(int param[]){}
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。7.1
从函数返回数组
伪代码
int *getArray(){
static int r[10]={1,2,3,4}; //C++不支持在函数外返回局部变量的地址,除非定义的局部变量为static变量
return r;
}
int main(){
int *p;
p=getArray();
return 0;
}
9.1 C++指针
null指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋予一个NULL值是一个良好的编程习惯,赋予NULL值得指针被称为空指针,他的地址为0 即if(!ptr)成立
C++指针的算术运算
指针可以进行四种算术运算:++、--、+、-
假设ptr是一个指向地址为1000的整数指针,是一个32位的整数,让我们对该指针执行下列算术运算:
ptr++
执行完此操作后,ptr将指向位置1004,因为ptr每增加一次,它都将指向一个整数位置,即当前位置往后移动4个字节。这个运算会在不影响内存位置中世纪值得情况下,移动指针到下一个内存位置。
经常用指针代替数组,因为变量指针可以递增或者递减,而数组不能递增或者递减,因为数组是一个常量指针。
指针数组:
#include <iostream>
using namespace std;
const int MAX = 4;
int main (){
const char *names[MAX] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
for (int i = 0; i < MAX; i++){
cout << "Value of names[" << i << "] = ";
cout << names[i] << endl;
} return 0;
}
C++ 指向指针的指针(多级间接寻址)
int **var;
int var=300;
int *ptr=&var;
int **pptr=&ptr;
cout<<(*ptr)<<(**pptr)<<endl;
10.1 C++引用
引用与指针的区别:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以任何时候指向另一个对象。
- 引用必须在创建时初始化。指针可以在任何时间被初始化。
int i=17;
int & r=i;
C++把引用作为返回值
当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如:
#include<bits/stdc++.h>
using namespace std;
double vals= {1.1,2.2,3.3,4.4};
double& setValues(int i){
return vals[i]; //返回第i个元素的引用
}
int main(){
cout<<"改变前的值"<<endl;
for(int i=0;i<5;i++){
cout<<"vals["<<i<<"]=";
cout<<vals[i]<<endl; }
setValues(1)=22.22;//改变第2个元素的值
setValues(3)=222222.2;
cout<<vals[1]<<" "<<vals[3]<<endl; }return 0;}
当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是可以返回一个静态变量的引用
int& func() {
int q;
//! return q; // 在编译时发生错误
static int x;
return x; // 安全,x 在函数作用域外依然是有效的
}
11. 1 C++基本的输入输出
标准错误流(cerr)
预定义的对象 cerr 是 ostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr对象是非缓冲的,且每个流插入到 cerr 都会立即输出。
标准日志流(clog)
预定义的对象 clog 是 ostream 类的一个实例。clog 对象附属到标准错误设备,通常也是显示屏,但是 clog对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲在,直到缓冲填满或者缓冲区刷新时才会输出。
clog 也是与流插入运算符 << 结合使用的,如下所示:
clog<<"ddddd"<<endl;
12.1 C++数据结构
指向结构的指针
您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;
现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
typedef 关键字
下面是一种更简单的定义结构的方式,您可以为创建的类型取一个"别名"。例如:
typedef struct
{
char title[50];
int book_id;
}Books;
现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字。下面是实例:
Books Book1, Book2;
您可以使用 typedef 关键字来定义非结构类型,如下所示:
typedef long int *pint32;
pint32 x, y, z;
x, y 和 z 都是指向长整型 long int 的指针。