C++第一课:C++和C的区别

思维导图

一,头文件与命名空间

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;
}

第一节完结,撒花 

       ✿✿ヽ(°▽°)ノ✿                                           

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值