前言
花些时间,去学习自己想去探索的事情,满满星光路,共勉!
一:简单介绍
C++语言是一种编译式的、通用的并且对大小写敏感的编程语言,完全支持面向对象的开发模式。
二:基本的输入和输出
1:认识相关函数
在C语言中,标准的键盘输入和屏幕输出功能分别使用scanf()和printf()两个函数实现。在C++语言中。类库中提供了输入流类 istream 和输出流类 ostream。cin和cout分别是是 istream 类和 ostream 类的对象,用来实现用来实现基本的键盘输入和屏幕输出。
cin实现输入的一般格式:
cin>>变量1>>变量2>>....>>变量n;
cout实现输出的一半格式
cout<<变量1<<变量2<<....<<变量n;
2:代码示例
#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ #include<string> using namespace std;//表示命名空间std,命名空间的作用是为了消除同名引起的歧义 int main() { int oneInt1,oneInt2; char strArray[20];//用字符数组oneArry来表示字符串 string str;//用String类的对象来表示字符串 double oneDouble; char oneChar='a'; cout<<"输入两个整型值,一个字符,一个字符串和一个浮点值,";//字符串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。 //cout输出 cout<<"以空格、Tab键或者 <Enter>键分隔:"<<endl; cin>>oneInt1>>oneInt2>>oneChar>>strArray>>oneDouble;//cin输入 str = strArray; cout<<"输入的数据是:"<<endl;//endl的作用是换行 cout<<"字符串是:\t\t"<<str<<endl//\t是制表符Tab <<"两个整型值分别是:\t"<<oneInt1<<"和\t"<<oneInt2<<endl <<"字符是:\t\t"<<oneChar<<"\n"//"\n"的作用和endl的作用一样,表示换行 <<"浮点值是:\t\t"<<oneDouble<<endl; return 0; }
3:运行结果
4:注意事项
4:注意事项
假如cin和cout包含的项过长时,可以将其写在多行中,可以在>>和<<分行,但>>和<<后买你只能跟一个项,不能多个项连用:
cout<<a,b,c; //这种写法只能输出a的值
cout<<a<<b<<c;//正确写法
cout<<a+b+c;//由于<<后是一个表达式,所以可以看作是一个项目,正确。
三:头文件和命名空间
头文件,我们可以理解成在打仗时需要调用的各种武器。C语言中使用头文件保存程序中用到的声明,C++也是如此,当程序中使用cin和cout时必须在程序的最前面包含输入和输出的标准流iostram,每条#include指令仅包含一条头文件,如果需要多个文件头,就需要多条#string指令。
常用的头文件有以下一些
标准输入输出流 |
<iostresm> |
标准文件流 |
<fstream> |
标准字符串处理函数 |
<string> |
标准数学函数 | <cmath> |
除了使用系统提供的头文件外,还可以定义自己的文件头,并在程序中使用#include指令将其包含起来。使用尖括号括住系统提供的文件头,使用双引号括住自己定义的头文件。
使用关键字namespace把大量的有逻辑联系的程序实体组合在一个标识符下,C++标准程序库中的所有标识符都定义在一个名为std的命名空间中,当程序使用标准标准程序库中的标识符时,如果没有语句“using namespace std;”则cin和cout都没有定义,string和endl也是如此
定义一个命名空间(名字空间)的语法格式:
namespace 命名空间名 { 命名空间内的各种声明(函数声明、类声明、...) }
引用其他命名空间的标识符的语法
命名空间名::标识符名
C++提供的using语句可以简化以上写法
using 命名空间::标识符;//可以在本文件中直接使用该标识符
using namespace 命名空间名;//可以在本文件中直接是使用指定命名空间的所有标识符
四:强制类型转换运算符
当不同的类型的变量进行混合运算的时候,系统会进行合理的类型转换,我们也可以使用强制类型转化运算符 static_cast(用于将一种数据类型转换成另一种数据类型) 或者 const_cast (用于去除指针和引用的常量性,但是不能去掉变量的常量性)进行转换。
static_cast <类型名> (表达式)
const_cast <类型名> (表达式)
1:代码示例
#include <iostream> using namespace std; int main() { int a=10; const int*p =&a;//不能使用常量指针p来修改a的值 const int ca = 30;//被const修饰 int *q; cout<<"a的地址是:\t"<<&a<<"\ta的值是:\t"<<a<<endl; cout<<"*p指向的地址是:"<<p<<"\t*p的值是:\t"<<*p<<endl; q =const_cast<int*>(p);//去除p的常量性,赋值给q int型 *q=20; cout<<"a的地址是:\t"<<&a<<"\ta的值是:\t"<<a<<endl; cout<<"*p指向的地址是:"<<p<<"\t*p的值是:\t" <<*p<<endl; cout<<"*q指向的地址是:"<<q<<"\t*q的值是:\t" <<*p<<endl; cout<<"分界线"<<endl; p=&ca;//ca的值不能被修改 q=const_cast<int*>(p); *q=40; cout<<"ca的地址是:\t"<<&ca<<"\tca的值是:\t"<<ca<<endl; cout<<"*p指向的地址是:"<<p<<"\t*p的值是:\t"<<*p<<endl; cout<<"*q指向的地址是:"<<q<<"\t*q的值是:\t"<<*q<<endl; return 0; }
在这一个程序中,我们定义了一个常量型的p,和一个非常量的指针q。如果直接将p的值直接赋值给q,编译出来会出现错误,但是当我们使用强制性类型转换的话就会成功。
2:程序解释
又发现分界线前后的p和q的地址相同,但是出现了值不相同的情况:当我们用同样的方法处理ca的时候,ca有了const属性,因此ca的值不会发生改变。即使我们将ca的指针p的const属性去掉然后重新赋值给q,再对q的值进行修改,并将所指的内容进行更改,还是不会对ca的值进行修改。因此就出现了变量ca的地址和指针q指向的地址相同但是值不同的情况。
五:函数参数的默认值
在C++语言中,可以在声明函数时为形参指定默认值,当我们在调用有默认参数值的函数时调用语句中可以不给出对应的实参,这就相当于调用该函数的默认值作为参数。指定默认值时不仅可以用常熟,还可以用任意有定义的表达式作为参数的默认值,但不允许是函数的局部变量。注意要先定义再声明最后再调用。
代码示例
#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; void func(int a=11,int b=12, int c=33) //为参数a,b,c分别设置默认值 { cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl; } int main(int argc, char** argv) { func();//调用时缺少了三个实参,就是用定义的参数的默认值,也就是无返回值 func(13);//调用时缺少后面的两个实参,就调用后买你凉饿参数定义的默认值 func(13,14);//调用时缺少最后一个实参,最后一个就使用被定义中的默认值 func(13,14,666); //三个参数均可调用实参,就不会使用定义中的默认值 return 0; }
1:注意事项
C++语言中规定:提供默认值时并且在函数声明时,必须按照从右至左的顺序提供,有默认值的形参必须在形参列表的最后。可以理解为,在有默认值的形参右侧,不能有无默认值的形参。
声明函数时,形参的最大默认值是从右至左
调用函数时,实参与形参是从左至右进行匹配对应的
2:简单举例
void defaultvalue1(int = 2,double = 3.0);//对函数进行声明,正确。 void defaultvalue2 (int a,double = 3.0);//b有形参,并且在b的右侧没有出现没有默认值的形参,正确。 void defaultvalue3(int a = 2,double b);//错误,a有形参,但是在a的右侧忽略了b的默认值。 假设给出如下函数声明: void func(int a,int b=2,int c=3); 则: func(1,22,33);//正确 func();//错误,a没有声明默认值,必须给出实参值 func(10,20);//正确,参数c没有给定实参值,因此调用默认值3 func(5,,8);//错误,从左至右给定实参值不能间断 假设给出如下的函数和变量声明: int Max(int m,int n); int a,b; void func2(int x,int y = Max(a,b),int z = a-b) {..... } 则下列函数: func2(4);//正确 func2(4,6);//正确 函数参数的默认值可以写在声明函数的地方,也可以写在定义函数的地方,但是不能两个地方都写。