思维导图
一,头文件与命名空间
1,C++的源文件后缀还是(.cpp),头文件后缀还是(.h)。
2,C++和C的头文件:
2.1,都可以用#include<stdio.h>。
2.2,C++特有标准输入输出流头文件<iostream>。
2.3,C++包含自己的头文件#include"My head"。
2.4,输入和输出操作也可以在C++实现,通过使用C标准输入和输出库(cstdio,在C语言中称为stdio.h)。
3,C++有了命名空间的引入(妈妈再也不用担心变量的重定义了),关键字namespace
3.1,命名语法,请看以下代码:↓
namespace EK//namespace+空间名
{
int a;//空间里面定义变量。
void print()//空间里面定义函数(第一种方法)。
{
printf("EK里面的函数\n");
}
}
namespace JJ//namespace+空间名。
{
int a;//定义变量。
void print();//空间里面声明函数。
}
void JJ::print() //在空间外定义函数,(::)这个符号是作用域分辨符,我理解为进入空间符。
{
printf("JJ里面的函数\n");
}
3.2,可以增加标识符的使用率,C语言同一个作用域下不允许定义相同的标识符,所以妈妈再也不用担心变量的重定义了。
3.3,(::)这个符号是作用域分辨符,简称进入空间符,如果想访问空间中的变量或者调用空间函数,就要用到它,用来标识全局变量 ,具体使用请看以下代码:↓
int a = 3;//定义局部变量
printf("局部变量中的a:%d\n", a);//调用局部变量中的a。
EK::print();//EK::print().就是调用EK空间中的print函数。
printf("EK空间中的a: %d\n", EK::a);//EK::a就是调用EK空间中的a。
printf("JJ空间中的a: %d\n", JJ::a);//JJ::a就是调用JJ空间中的a。
JJ::print();//JJ::print()就是调用JJ空间中的print函数。
3.3.1,代码运行结果如下:↓
3.4 有没有发现,每次调用空间中的变量或者函数都要用(::)这个符号,真的麻烦,所以就有了using语法 ,可以省略前缀的写法。
3.4.1代码如下:↓
using namespace EK;//省略EK的空间名
printf("EK中的a:%d\n",a);//省略EK的空间名,直接访问EK中的a。
print();//省略空间名,直接访问EK中的函数
/*
* 注意省略只能出现一次
using namespace JJ;
printf("%d", a);//编译器报错,原因a不明确,也就是二异性问题,两个无法选择。
*/
//省略EK空间名以后,如果还想访问JJ则需要用到,(::)。
3.5,当然空间名定义时,也可以嵌套,那我们怎么访问呢,请看以下代码
3.5.1,空间名的嵌套与空间内容访问
//嵌套定义空间名。
namespace EK//namespace+空间名
{
int a=1;//空间里面定义变量。
void print()//空间里面定义函数(第一种方法)。
{
printf("EK里面的函数\n");
}
namespace JJ//namespace+空间名。
{
int a = 2;//定义变量。
void print();//空间里面声明函数。
}
}
void EK::JJ::print() //在空间外定义函数,(::)这个符号是作用域分辨符,我理解为进入空间符。
{
printf("JJ里面的函数\n");
}
int main()
{
//嵌套空间如何调用,我才用剥洋葱方式,一层一层进入,先进EK再进JJ最后访问。
EK::print();//EK::print().就是调用EK空间中的print函数。
printf("EK空间中的a: %d\n", EK::a);//EK::a就是调用EK空间中的a。
printf("JJ空间中的a: %d\n", EK::JJ::a);//EK::JJ::a就是调用JJ空间中的a。
EK::JJ::print();//EK::JJ::print()就是调用JJ空间中的print函数。
return 0;
}
二,基本输入和输出
1,C++输入输出要加头文件#include <iostream>
2,一般情况都会包含命名空间 using namespace std;,别管为啥,不写的话用啥函数都要写std::,所以写就完事了。
3,输出cin<<数据,C++也支持C语言的输入格式。 输入cin>>数据。C++更加简便快捷。
3.1 实现代码如下:↓
void testInOut()
{
using namespace std;// 一般都是写在这里,避免std的前缀使用
cout << "I Love 晗晗";//输出字符串,并不需要什么格式,所以喜欢C++
cout << "\n";//输出换行。
int a = 1;//整形
double b = 1.11;//浮点型
char c = 'A';//字符
char str[] = "I Love 晗晗";//字符串类型
//输出各种类型数据,endl为结束换行。
cout <<"a="<<a << "\t" << "b=" << b << "\t" << "c=" << c << "\t" << "str=" << str << endl;
//强制转换int(a)或者 (int)a 都可以。
cout << "强制转换后的b:" <<"\t" << int(b) << "\t"<< "强制转换后的b:" << (int)b << "\t" << endl;
//隐式转换
int aa = 1.11;
cout <<"aa=" << aa << endl;
//C++输出浮点类型时,没有c语言中的%.2lf这种保留小数点后几位输出数据,不过可以自己实现。
double bb = 1.234;
//使用setprecision函数保留小数点后几位,记得加上头文件->#include <iomanip>
cout << "bb=" << fixed << setprecision(2) << bb<< endl;
//输入的使用
int n;
double nn;
char nnn;
char pstr[10];
cout << "输入一个整数:"<<endl;
cin >> n;
cout << "输入一个浮点型:"<<endl;
cin >> nn;
cout << "输入一个字符:" << endl;
cin >> nnn;
cout << "输入一个字符串:" << endl;
cin >> pstr;
cout << "整数" << "\t" << "浮点型" << "\t" << "字符" << "\t" << "字符串" << endl;
cout << n<<"\t" << nn<<"\t" << nnn<<"\t" << pstr<<endl;
}
3.1.1代码运行截图如下:↓
3.2输入注意的几个问题:
void testCin()
{
using namespace std;
char str[10] = "";
cin >> str; //不带空格的输入
cout << str;
while (getchar() != '\n'); //加了之后可以二次输入
char c;
cin >> c;
cout << c;
cin.getline(str, 10);//这两个都可以接受空格输入
cout.write(str, 10);
}
3.3关于命名空间的std
4.C++中有了string进行字符串的定义,使用时要加上#inciude<string>
4.1操作代码如下:↓
#include<iostream>
#include<string>//使用string应加头文件<string>
using namespace std;
void testStd()
{
string s1;//变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。
string s2 = "c plus plus";//变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志'\0'。
string s3 = s2;//变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。
string s4(5, 's');//变量 s4 被初始化为由 5 个's'字符组成的字符串,也就是"sssss"。
cout << "s1为:" << s1 << endl;
cout << "s2为:" << s2 << endl;
cout << "s3为:" << s3 << endl;
cout << "s4为:" << s4 << endl;
}
int main()
{
testStd();
return 0;
}
4.1.1运行截图如下:↓
三,新数据类型
1,bool类型
1.1占用内存是一个字节
1.2计算机非零表示成立,只有0或者指针空表示不成立
1.3一般充当函数返回值,或者开关
1.4正常输出是0和1
1.5C++专有的赋值方式,false和true
1.6代码测试如下:↓
#include<iostream>
using namespace std;
void testBool()
{
bool a = 100;
bool aa = -100;
bool aaa = 0;
bool aaaa = true;
bool aaaaa = false;
cout << "a:" << a << endl;
cout << "aa:" << aa << endl;
cout << "aaa:" << aaa << endl;
cout << "aaaa:" << aaaa << endl;
cout << "aaaaa:" << aaaaa << endl;
}
int main()
{
testBool();
return 0;
}
1.6.1运行结果如下:↓
2,注意:C语言中写空就是NULL,C++中的改成了nullptr,不过你写NULL也没错,写nullptr可以装13啊,根据个人爱好写吧!
3,引用类型(就是取小名)
3.1 基本引用代码如下:↓
//类型名& 别名 = 要起别名的东西;
int 晗晗 = 1314;
int& 二康老婆 = 晗晗; //晗晗有另一个名字叫二康老婆 ,晗晗就是二康老婆,二康老婆就是晗晗
cout << "晗晗:" << 晗晗 << endl;
cout << "二康老婆:" << 二康老婆 << endl;
3.1.1运行截图如下:↓
4,C++种常量要求更严格
4.1代码实现如下:↓
#include<iostream>
using namespace std;
void testConst(const char* str)//传字符串时加上const,不然报错
{
cout << str << endl;
}
int main()
{
const char *str = "我爱晗晗";
testConst(str);//字符串变量初始化时,也要加上const,否则报错
testConst("我爱晗晗");//字符串常量传入。
return 0;
}
4.1.1运行截图如下:↓
5,常引用
//int& x = 1; //直接报错,C++对const要求更严格
int aa = 1;
const int& x = 1; //第一种写法:const修饰
const int& x2 = aa;
//右值引用,只能给右值起别名
int&& xx = 1; //常量是右值(运算符的右边)
//int&& xx2 = aa; //右值引用只能给右值起别名
6,引用的好玩操作,切记(&)这个符号是引用符号,不再是取地址
6.1代码实现如下:↓
#include<iostream>
using namespace std;
void testQuote(int 假的二康)//传入二康的分身
{
假的二康 = 1314;//修改二康的分身的数据
}
void testQuote1(int& 小二康)//给二康起个小名叫小二康
{
小二康 = 100;//修改小二康的数据
}
void swap(int& a, int& b)//交换a和b
{
int c;
c = a;
a = b;
b = c;
}
int g_num = 1001;
void modifyPointA(int* p)//传入指针
{
p = &g_num;//给指针赋值
}
void modifyPointB(int*& p) //int*为类型,引用指针类型
{
p = &g_num;//给指针赋值
}
void rightQuote(int&& a)
{
a += 10;
cout << "a为:" << a << endl;
}
/*
* void rightQuote2(const int& a)//这种会报错,常引用不能修改
{
a += 10;
cout << "a为:" << a << endl;
}
*/
int getData()
{
return g_num;
}
int& getValue()
{
return g_num;
}
int main()
{
//1,通过引用可以在函数中修改实参,而不用指针
int 二康 = 1;
int 晗晗 = 1314;
cout << "二康为:" << 二康 << endl;
testQuote(二康);//修改二康的分身,得到的二康
cout << "二康为:" << 二康 << endl;
testQuote1(二康);//修改二康得到的二康
cout << "二康为:" << 二康 << endl;
swap(二康,晗晗);//此时二康为100,晗晗为1314,二者交换。
cout << "二康为:" << 二康 << endl;
cout << "晗晗为:" << 晗晗 << endl;
int* p=&二康;//此时指向二康,默认值1314
modifyPointA(p);//将g_num = 1001地址赋值给p
cout << "*p为:" << *p << endl;//第一个失败
modifyPointB(p);//将g_num = 1001地址赋值给p
cout << "*p为:" << *p << endl;//第二个成功
//2,右值引用
rightQuote(10);
//rightQuote2(10);错误写法
//返回值就是一个值,这个值只能是右值
//getData() = 1001; 错误
getValue() = 0; //返回引用表示返回变量本身
cout << g_num << endl;
return 0;
}
7,auto类型
7.1,自动推断类型auto类型: 必须根据赋值的数据推断类型,不能直接推断
int a=6;
int* p=&a;
auto f = 3.14; //double
auto n="hello"; //const char*
auto z = p; //int *
auto x1 = 5, x2 = 5.0, x3 = 'r'; //错误,必须是初始化为同一类型
四,函数思想
1,内敛思想 inline关键字
1.1,什么样的函数可以成为inline,短小精悍
inline int Max(int a, int b)
{
return a > b ? a : b;
}
1.2,在结构体中或者类种实现的函数默认内敛(知道即可)
2,函数重载: C++允许同名不同参数函数存在
2.1参数数目不同
2.2参数类型不同
2.3参数顺序不同(一定建立在不同类型的基础上)
void print(int a)
{
cout << a << endl;
}
void print(int a, int b)
{
cout << a + b << endl;
}
/*和上面不是顺序不同,顺序不同指的是类型不同
void print(int b, int a)
{
cout << a + b << endl;
}*/
void print(int a, char b)
{
cout << "int,char" << endl;
cout << a + b << endl;
}
void print(char a, int b)
{
cout << a + b << endl;
}
int main()
{
print(1, 'A'); //重载调用,优先调用类型一致,所以调用print(int a, char b)
print('A','A'); //这种就会报错,因为太多选择,如果只有一个则会强转
return 0;
}
3,函数缺省: C++中允许给函数形参初始化
3.1缺省顺序 必须从右往左缺省,缺省的参数中间不能存在没有缺省的
3.2没有参入参数,使用的是默认值
代码实现如下:↓
//函数缺省
void printData(int a=1, int b=2, int c=3, int d=4)
{
cout << a + b + c + d << endl;
}
int main() //函数缺省可以理解为函数重载的综合,没给参数使用默认值
{
printData(); //a=1 b=2 c=3 d=4
printData(10); //a=10 b=2 c=3 d=4
printData(10, 20); //a=10 b=20 c=3 d=4
printData(10, 20, 30); //a=10 b=20 c=30 d=4
printData(10, 20, 30, 40);//a=10 b=20 c=3 d=40
return 0;
}
第一节完结,撒花
✿✿ヽ(°▽°)ノ✿