2020.10.26 第1课 C++与C的区别

本文介绍了C++与C在源文件扩展名、头文件、命名空间、输入输出、数据类型、函数以及动态内存申请等方面的基本区别。重点讨论了C++中的新特性,如bool类型、引用类型、内联函数、函数重载、缺省参数和动态内存管理。
摘要由CSDN通过智能技术生成

2020.10.26 第01课 C++与C的区别

C++与C的区别

一、基本区别

1.源文件改为.cpp
2.头文件的改变

2.1 标准的C++头文件: #include

2.2 包含C语言的头文件

2.2.1 常规包含

2.2.2 去掉.h 包含

二、命名空间引入

1.如何创建

namespace 空间名
{
	int age;
}

2.学会调用

2.1 常规调用:空间名::成员 :空间名::age 作用域分辨符

2.2 using namespace 空间名; 用来省略前缀调用

3.嵌套:学会使用

#include <iostream>
//#include <stdio.h>
#include <cstdio>
#include <ctime>
using namespace std;		//命名空间
namespace MM 
{
	int age;
	int num;
	void print() 
	{
		printf("MM空间中的函数");
	}
}
namespace boy 
{
	int age;
	int num;
}
//嵌套
namespace A 
{
	int a;
	namespace B 
	{
		int b;
	}
}

int main() 
{
	printf("C语言的打印!\n");
	//1.最常规的用法   作用域分辨符
	MM::age = 1001;
	MM::num = 9999;
	MM::print();
	//2.省略前缀
	using namespace boy;
	age = 1001;
	num = 999;
	boy::age = 199;
	//3.空间嵌套的访问
	A::a = 100;
	A::B::b = 1001;
	using namespace A::B;
	b = 1004;
	printf("%d\n", b);
	return 0;
}

三、C++的输入输出

主要学会使用,是个什么东西先不用

1.基本输出 cout 和<<

cout<<1;
int num=1;
float fNum=1.1f;
char *str="ILoveyou";
cout<<num<<"\n";
cout<<fNum<<"\n";
cout<<str<<"\n";
cout<<num<<fNum<<str<<endl;
//"\n"可以替换为endl
cout<<str<<endl;

2.基本输入 cin >>

int num;
cin>>num;
float fNum;
cin>>num>>fNum;
char str[5];
cin>>str;

四、数据类型上的区别

1.引入新的类型:bool类型 布尔 c99以上的库

1.1 false 和 true 真和假意思

1.2 非零表示成立 ,零或者空表示不成立 ,bool类型可以赋值任何东西

1.3 bool类型变量打印出来只有0和1

1.4 占用1个字节

2.引入引用类型:及其重要的类型

2.1 理解为起别名

​ 类型& 别名=变量;

2.2 常规使用1: 当作函数参数防止拷贝本的存在

2.2 常规使用2: 当作函数返回值 ,相当于返回一个变量

2.3 特殊的引用 : 常引用

#include <iostream>
using namespace std;
void modify(int* a) 
{
	*a = 1001;
}
void modifyCPP(int& a)	//int& a=num;
{
	a = 1003;
}
int g_num = 1001;
void modifyPoint(int* &p)	//指针的引用  int* &p=pp;
{
	p = &g_num;
}
int returnNum() 
{
	return g_num;		//返回变量就是返回一个值
}

int& returnG_num() 
{
	//不能返回局部变量引用
	return g_num;
}
//可以传常量,也可以传入变量
void printConst(const int& num) 
{
	//const 当修饰形参,当前函数中不能修改形参
	cout << num << endl;
}
//只能传常量
void printConstTrue(int&& num)
{
	cout << num << endl;
}

int main() 
{
	//1.第一个数据类型
	//bool类型占用一个字节
	bool flag = true;
	cout << flag << "\tsize:" << sizeof(flag) << endl;
	flag = 1000;
	//非零表示成立 成立是真 ,真就是1
	cout << flag << endl;
	//可以输出false和true
	cout << boolalpha << flag << endl;
	//2.引用类型   为变量起别名
	int 小芳 = 100;
	int& 亲爱的 = 小芳;
	亲爱的 = 999;
	cout << 小芳 << endl;
	int num = 1998;
	//C语言
	modify(&num);
	cout << num << endl;
	//C++
	modifyCPP(num);		//传参就是一个赋值操作
	cout << num << endl;
	int* pp = &num;
	modifyPoint(pp);
	cout << *pp << endl;

	//returnNum() = 1;
	//g_num=9999;
	returnG_num() = 9999;
	cout << g_num << endl;

	printConst(1);
	printConst(num);
	printConstTrue(1001);
	return 0;
}

五、函数上的区别

1.引入内联的思想: 牺牲空间 提高效率 编译后是二进制的形式

短小精悍

inline修饰的函数

在结构体中和类中实现的函数默认为内联的函数

2.函数重载: 允许相同函数名不同参数的函数存在

putimage();

loadimage();

2.1 参数数目不同

2.2 参数类型不同

2.3 参数顺序不同,建立在存在不同类型

和返回值类型没有任何关系

3.函数缺省的思想: 就是给形参初始化

作用:为了实现函数的不同调用形参 ---->(构造不同的对象)

规则: 缺省必须从右边开始缺省 中间不能存在空挡

注意: 不要和重载产生冲突,多文件中,只需要在声明的时候缺省不需要在实现中缺省

#include <iostream>
using namespace std;
void modify(int* a) 
{
	*a = 1001;
}
void modifyCPP(int& a)	//int& a=num;
{
	a = 1003;
}
int g_num = 1001;
void modifyPoint(int* &p)	//指针的引用  int* &p=pp;
{
	p = &g_num;
}
int returnNum() 
{
	return g_num;		//返回变量就是返回一个值
}

int& returnG_num() 
{
	//不能返回局部变量引用
	return g_num;
}
//可以传常量,也可以传入变量
void printConst(const int& num) 
{
	//const 当修饰形参,当前函数中不能修改形参
	cout << num << endl;
}
//只能传常量
void printConstTrue(int&& num)
{
	cout << num << endl;
}

int main() 
{
	//1.第一个数据类型
	//bool类型占用一个字节
	bool flag = true;
	cout << flag << "\tsize:" << sizeof(flag) << endl;
	flag = 1000;
	//非零表示成立 成立是真 ,真就是1
	cout << flag << endl;
	//可以输出false和true
	cout << boolalpha << flag << endl;
	//2.引用类型   为变量起别名
	int 小芳 = 100;
	int& 亲爱的 = 小芳;
	亲爱的 = 999;
	cout << 小芳 << endl;
	int num = 1998;
	//C语言
	modify(&num);
	cout << num << endl;
	//C++
	modifyCPP(num);		//传参就是一个赋值操作
	cout << num << endl;
	int* pp = &num;
	modifyPoint(pp);
	cout << *pp << endl;

	//returnNum() = 1;
	//g_num=9999;
	returnG_num() = 9999;
	cout << g_num << endl;

	printConst(1);
	printConst(num);
	printConstTrue(1001);
	return 0;
}

六、动态内存申请

1.为单个变量申请内存

int *p=new int;
delete p;

2.申请为数组

int* array=new int[4];
delete [] array;   //delete array;

3.在申请当中可以直接初始化

//()为单个变量初始化
int *p=new int(100);  //*p=100;
int *array=new int[4]{1,2,3,4}; //array[0]=1;
//{}为多个变量初始化

4.内存池的概念

C++允许在已申请的内存上在分配内存

char *pMemory=new char[1024];
//让pMemory前16个字节存放4个整数
int *pInt=new(pMemory+0) int[4];
//存字符串:10个长度
char* pChar=new(pMemory+16)char[10]; //char* pChar=new(pInt+4) char[10];
#include<iostream>
using namespace std;
int main() 
{
	//C语言 :malloc ralloc calloc+free
	//C++: new +delete
	int* pInt = new int;
	*pInt = 1001;
	delete pInt;
	pInt = NULL;
	int* array = new int[4];
	array[0] = 1;
	delete[] array;  //没有这种: delete[][] array;
	array = NULL;

	int* p = new int(4);
	cout << *p << endl;
	int* pArray = new int[3]{ 1,2,3 };
	for (int i = 0; i < 3; i++) 
	{
		cout << pArray[i] << endl;
	}
	delete[]pArray;
	pArray = nullptr;		//nullptr替换C语言中的NULL
	int** array2D = nullptr;
	array2D = new int* [3];
	for (int i = 0; i < 3; i++) 
	{
		array2D[i] = new int[3];
	}
	delete array2D;
	array2D = nullptr;
	char* pMemory = new char[1024];
	//让pMemory前16个字节存放4个整数
	int* ppInt = new(pMemory + 0) int[4];
	//存字符串:10个长度
	char* pChar = new(pMemory + 16)char[10]{"ILoveyou"};
	printf("%s\n", pMemory+16);	//I
	delete [] pMemory;
	pMemory = nullptr;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值