当前位置: 首页 > news >正文

C++1-C语言和C++的区别

一、C语言与C++的区别

1、头文件:

C++:

#include<iostream>
using namespace std;//使用 名空间 std,使用标准的std名空间
//#include<iostream.h>//可以用,不建议,延续C语言比较老的写法

c语言:

#include <stdio.h>  //预处理命令

2、思想

C++ – 面向对象;
C – 主要学编程思想 – 函数设计 – 流程图 – ;
C++ – 面向对象思想 – 类的设计 – 抽象 – 类图(用例图、UML);

UML类图试样例(工具画出来是由颜色的):
在这里插入图片描述

iostream : istream-- 输入流类 ostream – 输出流类

3、输入输出

cin – istream — 输入流类
cout – ostream — 输出流类

void main()
{
	int a;
	cin>>a;
	cout<<a<<endl;
	cout<<"sadasfs"<<endl;
}

endl:结束并换行
cin 和 cout 是函数,不是对象;
“>>” 为输入运算符;
”<<“ 为输出运算符;

4、命名空间

命名空间 – 解决词穷(解决不同文件里出现同命名函数名的问题)
情景示例:
在一个比较大的程序或项目内;写一个排序函数;
不同项目组可能存在一样的名字的函数,

void sort()
{

}
void sort()
{

}
namespace AA
{
	void sort()
	{
		cout<<"AA::sort()"<<endl;
	}
}

namespace BB
{
	void sort()
	{
		cout<<"BB::sort()"<<endl;
	}
}

using namespace AA;//如果需要使用AA里面的所有东西,需要声明一下名空间
//如果只是想用BB里的个别的,可以不声明,直接使用BB::sort();
void main()
{
	sort();
	BB::sort();
}

运行结果:
在这里插入图片描述

5、#include <>和" "的区别(笔试题)

两者搜索路径不一样;
#include <> — 其中包含的文件是库里面的文件,在安装目录中查找;
#include “” – 其中包含是文件是自己写的,搜索路径:再当前本工程目录底下查找该文件;

6、struct 的区别:

区别

1)、
C语言要求结构体内至少有一个成员;
C++里可以为空,大小为1 – 占位符;

在这里插入图片描述

2)、

struct Student 
{
};

C语言里:Studnet为结构体名;struct Student为类型;除非typedef;
C++里:Student可以为类型名、类名;
3)、
C语言里:结构内不能包含函数;
C++里:可以有函数;

结构体内存字节对齐:

//如果小的在两边,就把小的分别和大的对齐
struct Student1
{
	char a;  //1--因为B-->4
	int b;   //4
	short c; //2-->4
};//4+4+4 = 12

//如果小的在一边,就把小的之和和大的对齐
struct Student2
{
	char a;  //1--因为B-->2
	short B; //2
	int C;   //4
};//2+2+4 = 8

//大的小的,是指基本数据类型,下列int a为大
struct Student3
{
	int a;    //4
	char b[5];//5*1=5 --大的倍数-->8
	//数组是构造数据类型;
}; //4+8 = 12

//大的为double c -- 8
struct Student4
{
	int a;    //4 -- 8
	char b[5];//5*1=5--->8
	//数组是构造数据类型;
	double c;//8
};//8+8+8 = 24

void main()
{
	cout<<sizeof(Student1)<<endl;
	cout<<sizeof(Student2)<<endl;
	cout<<sizeof(Student3)<<endl;
	cout<<sizeof(Student4)<<endl;
	
}

运行结果:

在这里插入图片描述

7、类

类 – 抽象出来的,由现实生活中实实在在的一写实体的共性抽象出来,形成一个类型,将不同类型的数据以及与这些数据相关的操作封装在一起,构成一个新的数据类型;现实生活中不存在,不占用内存单元;例如int 用来定义,本身不占用空间。

8、函数重载

1、函数名相同(同一个作用域下);
2、函数的参数列表不同(参数的类型,个数,顺序);
3、和函数返回值无关;
4、和常成员函数有关? — 后面联系类在展开

struct AA
{
	void fn(int a,int b) // fn的名字为AA::fn,::表示域
	{
	}
};

void fn() // ::fn,::前面啥也没有,表示全局
{
	cout<<"fn"<<endl;
}
void fn(int n)
{
	cout<<"fn(int)"<<endl;
}
void fn(int a,int b)
{
	cout<<"fn(int,int)"<<endl;
}
/*
int fn()//error,不能构成重载,不能仅通过函数返回值来确定重载
{
}
*/
void main()
{
	fn();
	fn(4);
	fn(1,2);
}

运行结果:
在这里插入图片描述

9、引用 – 实体的别名

1、引用在声明的时候必须先初始化;
2、没用空引用;
3、不能改变;
4、引用大小的为实体大小;
5、引用与实体的生存周期一样;

void main()
{
	int a = 10;
	//int &b;//error,引用声明的时候必须初始化
	int &b = a; //b是a的引用,即是b是a的别名
	b = 20;
	cout<<a<<endl;

}

引用的地址是相同:
在这里插入图片描述

笔试题:引用和指针的区别:

1、初始化:
引用声明的时候必须要初始化,指针可以不初始化,但会出现野指针;
2、NULL;
引用在初始化的时候不能初始化为NULL,但指针可以初始化为NULL;
3、修改:
引用一旦和实体相关起来就不可以修改,指针可以改变;
4、大小:
引用的大小和实体大小一样,指针大小永远是4字节;

相同点:都能通过所关联的变量修改关联的值:

类型:值类型 — 指针类型 — 引用类型

swap

//不同的时间里,修改了不同的内存单元中的内容 --- 实参和形参不同的内存单元 
void swap1(int a,int b)//交换失败
{
	int t = a;
	a = b;
	b = t;
}

//不同的时间里修改了不同的内存单元,没有对内容做修改 --- 实参和形参内存单元相同
void swap2(int *a,int *b)//交换失败,只是改变了指针的指向
{
	int *t = a;
	a = b;
	b = t;
}

//不同的时间里修改了同一段内存单元中的内容 --- 实参和形参的内存单元相同,并修改了内存
void swap3(int *a,int *b)//能交换
{
	int t = *a;
	*a = *b;
	*b = t;
}
//不同的时间里修改了自己本身
void swap4(int &a,int &b)//能交换
{
	int t = a;
	a = b;
	b = t;
}

void main()
{
	int x = 10;
	int y = 20;

	cout<<"原来的值:"<<x<<" "<<y<<endl; 

	swap1(x,y);
	cout<<x<<" "<<y<<endl;

	swap2(&x,&y);
	cout<<x<<" "<<y<<endl;

	swap3(&x,&y);
	cout<<x<<" "<<y<<endl;

	swap4(x,y);
	cout<<x<<" "<<y<<endl;

}

运行结果:

在这里插入图片描述

相关笔试题:

1、不使用第三方变量交换

方法一:+= 或者 -=

int main()
{
	int a = 10;
	int b = 20;
	
	//测试溢出
	int c = 1000000000;
	int d = 2000000000;

	printf("%d %d\n",a,b);
	printf("%d %d\n",c,d);

	//+= 或者 -=
	//思路很好,但可能有潜在的溢出风险(仅为可能,但应该问题不大)
	a += b;//a =30,b=20
	b = a - b;//a=30,b=10
	a = a - b;//a=20,b=10

	c += d;//a =30,b=20
	d = c - d;//a=30,b=10
	c = c - d;//a=20,b=10

	printf("%d %d\n",a,b);
	printf("%d %d\n",c,d);

	return 0;
}

结果:
在这里插入图片描述
方法二:使用 ^=

int main()
{
	int a = 10;
	int b = 20;

	printf("%d %d\n",a,b);

	//可以实现,但可读性不高,难理解
	a ^= b;
	b ^= a;
	a ^= b;

	printf("%d %d\n",a,b);

	return 0;
}

结果:
在这里插入图片描述

2、不用判断输出较大值:

(a+b+abs(a-b))/2 //abs() — 取绝对值

3、指针的运算相关题

相关知识点:
*p — 从p所指向的首地址开始,以p的基类型(指针变量所指向的变量的类型)所占的字节数为偏移量,将内存地址的内容取出来。

void main()
{
	char a[]={1,1,1,1,1};
	int *p = (int *)a;
	printf("*p = %d\n",*p);
}//结果为:00000001000000010000000100000001 --- 16843009

运行结果:

在这里插入图片描述
图形化理解:

在这里插入图片描述
扩展:

在这里插入图片描述

10、const

C语言内:const表示的是只读变量

是只读的意思,修饰的变量是只读变量,还是变量。
在这里插入图片描述

C++内:const 变成常量

用法:
1、const可以定义一个常量;
2、const 可以定义函数参数 — 可以提高程序的健壮性和可读性;
例如strcpy,可以一眼看出是将第二参数的值拷贝到第一参数,可读性好;
在这里插入图片描述
3、const 可以定义函数的返回值;
4、const可以定义常成员函数 — 需要在类里面;

#include <iostream>
using namespace std;

int& fn1()//函数返回值为引用,可以作为左值
{
	int a = 10;
	return a;
}

int& fn2(int b)
{
	return b;
}

int& fn3(int *b)
{
	return *b;
}

void main()
{
	fn1()=30;

	int a = 10;
	
	fn2(a)= 30;
	cout<<a<<endl;

	fn3(&a)= 30;
	cout<<a<<endl;

}

运行结果:

在这里插入图片描述

相关文章:

  • iOS开发 - NSTimer极限使用
  • 【电商】电商后台设计—售后流程
  • 2022:【例4.7】最小n值
  • CDH 08Cloudera Manager freeIPAKerberos安装配置
  • steam搬砖基础分析
  • PMP每日一练 | 考试不迷路-9.24(包含敏捷+多选)
  • 重写,重载,重定义习题
  • 8-Arm PEG-Acrylate,8-Arm PEG-AC,八臂-聚乙二醇-丙烯酸酯长期供应
  • qt 构建路径设置
  • 2022-09-23 答辩准备
  • 网课搜题接口API
  • Golang操作ES
  • Activity在Create阶段做的你不知道的事看源码
  • java编写一个程序,生成0~9之间的100个随机数字并且统计每一个数字的产生次数。
  • 【day11】LeetCode(力扣)练习【1652.拆炸弹】【235. 二叉搜索树的最近公共祖先】【733. 图像渲染】
  • Android 控件背景颜色处理
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA SE 6 GC调优笔记
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SegmentFault 2015 Top Rank
  • Spring框架之我见(三)——IOC、AOP
  • Vue2.x学习三:事件处理生命周期钩子
  • Vue学习第二天
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 时间复杂度与空间复杂度分析
  • 微信小程序实战练习(仿五洲到家微信版)
  • 微信小程序--------语音识别(前端自己也能玩)
  • Java总结 - String - 这篇请使劲喷我
  • 国内开源镜像站点
  • 通过调用文摘列表API获取文摘
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #Java第九次作业--输入输出流和文件操作
  • #Ubuntu(修改root信息)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $$$$GB2312-80区位编码表$$$$
  • %check_box% in rails :coditions={:has_many , :through}
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (九十四)函数和二维数组
  • (力扣)循环队列的实现与详解(C语言)
  • (七)Knockout 创建自定义绑定
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)【Hibernate总结系列】使用举例
  • ***测试-HTTP方法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 redis操作类