C++从入门到出门

C++ 概述

c++ 融合了3中不同的编程方式:

  • C语言代表的过程性语言
  • C++ 在C语言基础上添加的类代表的面向对象语言
  • C++ 模板支持的泛型编程

1、在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c++得用法改变了,c++头文件没有扩展名。但是有些c语言的头文件被转换为c+ +的头文件这些文件被重新命名,丢掉了扩展名.h(使之成为c++风格头文件),并在文件名称前面加上前缀c(表明来自c语言)。例如c++版本的math.h为cmath

2、namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
std就是命名空间(名字空间)的名字, 命名空间的作用主要是为了解决日益严重的名称冲突问题。随着可重用代码的增多,各种不同的代码体系中的标识符之间同名的情况就会显著增多解决的办法就是将不同的代码库放到不同的名字空间中。
思考:假如在项目中需要定义两个函数func,并且都能够被其他文件所访问到该怎么办?

3、cout是c++中的标准输出流,endl是输出换行并刷新缓冲区。

C++ 标准

一种描述C++ 的一些语法规则的代码准则
C++11

C++ 应用

  • 游戏
    • C++ 效率是一个很重要的原因,绝大部分游戏殷勤都是C++写的
  • 网络软件
    • c++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++ 语言最重要的成果之一。
  • 操作系统
    • 在该领域,c语言是主要的编程语言,但是c++凭借对c的兼容性,面向对象也开始应用在该领域
  • 嵌入式系统

C++ 编译器安装

编译器安装 + vscode

C++ 基础

命名空间

  1. 创建名字是程序设计过程中的基本活动,当一个项目很大的时候,名字会大量重叠,c++允许我们对名字的产生和名字的可见性进行控制
  2. 我们之前在学习c语言可以通过static关键字来是的名字只在本编译单元内课件,在c++ 中我们通过一种命名空间来控制对名字的访问。
  3. c++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类、对象…
  4. std是c++ 标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iosstream、vectore等都定义在该命名空间中,使得要加上using声明或者using指示
  • 命名空间的使用:

    命名空间定义:

    	namespace 名称 {
    			// 定义变量、函数、类型、对象
    	}
    

    命名空间 ( 全局范围内定义 ) 访问:

    	#include <iostream>
    	ussing namspace std;
    	namespace A {
    		int a = 10;
    	}
    	
    	namespace B {
    		int b = 20;
    	}
    	
    	int main(){
    		count << "a:" << A::a << endl;
    		count << "b:" << B::b << endl;
    		return 0;
    	}
    
    
    

注意事项:

命名空间只能在全局范围内定义。

引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量共用同一块内存空间。


引用的本质:

  • C++ 编译器在编译过程中使用常量指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见
    在这里插入图片描述
 Type& ref = val;    // Type* const ref = & val;

1、引用可以看作是一个一定义变量的别名
2、引用的语法:Type& name = vars;

注意:

1 & 再次不是求地址运算,而是起标识作用
2、类型标识符是指目标变量的类型
3、必须在声明引用变量时
4、引用初始化之后不能改变
5、不能有null引用,必须确保引用是和一块合法的存储单元关联
6、一个变量可以有多个引用(相当于一个变量有好几个别名)

  • 错误写法
int main(){
	int a = 10;
	int& b = a;
	
	// 定义没有初始化
	int& x; 
	// 没有空引用
	int& y = NULL;
	// 没有所谓的二级引用
	int&& c = 1; 
}

交换2个变量的数值: 使用引用来做

#include <iostream>
using namespace std;
void my_swap (int& a,int& b)
{
	int tmp = a;
    a = b;
	b = tmp;
}
int main ()
{
	int x = 10, y = 20;my_swap(x,y) ;
	cout << " x = " << x<< " y = " << y << endl;  
    // x = 20  y = 10
	return 0;
}

总而言之:
引用本身是一个变量,但是这个变量又仅仅是另外一个变量一个别名,它不占用内存空间,它不是指针哦!仅仅是一个别名!


引用和指针的区别

1、语法层面的区别

  • 从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;(引用是某个实例的别名。)

  • 程序为指针变量分配内存区域;而不为引用分配内存区域。

    int main()
    {
    	int a = 10;
    	int* ip = &a;
    	int& b = a;  \\b是a的别名 并没有分配新的空间
    }
    
    
  • 解引用是指针使用时要在前加“*”;引用可以直接使用。

    	int main()
    	{
    		int a = 10;
    		int* ip = &a;
    		int& b = a;  
    		*ip = 100//对于指针使用加“*”
    		b = 200//引用不需要“*”
    		
    	}
    
    
  • 指针变量的值可以发生改变,存储不同实例的地址;
    引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。

    int main()
    {
    	int a = 10,b = 20;
    	int* ip = &a;
    	ip = &b ;
    	int& c = a;
    	c = b;   //b的值给c实则是把b的值给a,将a的值改为20
    }
    
    
  • 指针变量的值可以为空(NULL,nullptr);没有空引用。

  • 指针变量作为形参时需要测试它的合法性(判空NULL);【引用不需要判空。】

  • 对指针变量使用"sizeof"得到的是指针变量的大小

  • 对引用变量使用"sizeof"得到的是变量的大小

    int main()
    {
    	double dx = 10;
    	double* dp = &dx;
    	double& a = dx; 
    	printf("sizeof(dp):%d\n", sizeof(dp));  // 4
    	printf("sizeof(a):%d", sizeof(a));   // 8
    }
    
    
  • 理论上指针的级数没有限制;但引用只有一级。
    即不存在引用的引用,但可以有指针的指针。

  • ++引用与++指针的效果不一样。

    	int main()
    (
    	int ar[5] = { 1,2,34,5 };
    	int* ip = ar; //数组首元素地址
    	int& b = ar[O]; //数组首元素的别名叫b
    	++ip;  //由0下标的地址指向1下标的地址
    	++b;  //由0下标指向1下标
    }
    
    

更多细节:参考引用单独详解 | 和指针区别


内联函数

特性

  • 内联函数不能声明与定义分离,如果分离,必会发生链接错误。
  • C++ 推荐使用内联函数替代宏代码片段
  • 内联函数在最终生成的代码中是没有定义的,C++ 编译器直接将函数体插入在函数嗲用的地方,内联函数没有普通函数调用时的额外开销( 压栈、跳转、返回 )
  • 因为内联函数在最终生成的代码中时没有定义的,所以内联函数的作用域可以理解成只在定义的文件中。加入在a.cpp中定义了inline int func ( int a ) { return ++a; }. 如果在b.c 中需要调用func函数,则在b.cpp中需要重新定义内联函数inline int func( int a ) { return ++a; }
  • inline 只是对编译器的一个内联请求,c+++ 内联编译会有一些限制,一下情况编译器可能不会考虑将函数进行内联编译:
    • 存在任何形式的循环语句
    • 存在果果的条件判断语句
    • 函数体过于庞大
    • 对函数进行取址操作

因此,内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的函数。

函数默认参数

这里参考前端里面的Typscript 默认参数语法


函数重载

概念:

  • 同一个函数名定义的不同函数
  • 当函数名和不同的参数搭配时函数的含义不同

条件

  • 同一个作用域
  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同

【C++】C++中函数重载的理解


函数重载的本质原理:(g++ 编译器,编译成了多个函数地址)
在这里插入图片描述


类 、对象

基本概念

1、现实世界的事物都具有的共性就是每个事物都具有本身的属性,一些自身具有的行为,例如一个学生有姓名、性别、年龄等属性,吃饭睡觉等行为。
2、类对于某个事物的描述起始还是抽象的,例如有一类事物有姓名、性别、年龄等属性,可以吃饭睡觉玩游戏等。如果只是描述的话起始我们还是不知道这个事物具体是什么样,因为这个类没有告诉我们每个属性具体的值是多少(这个事物的姓名是什么,年龄是多少),所以类只是对某一类事物的一个描述而已。实际应用中我们需要操作某类事物中的一个或者多个具体的事物。那么这个具体的事物我们就称之为对象。
3、类是抽象的,对象是具象的。
4、对象是怎么来的呢? 由类实例化来,因此我们也说通过一个类实例化一个对象。


1、在C++中可以给成员变量和成员函数定义访问级别。

  • ·public 公有的,修饰成员变量和成员函数可以在类的内部和类的外部被访问
  • ·private 私有的,修饰成员变量和成员函数只能在类的内部被访问
  • ·protected 被保护的,修饰成员变量和函数只能在类的内部被访问
//student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <iostream>
using namespace std;
class Student
{
    public:
        int GetAge() {
        	return m_age;
        };   //声明类的成员函数,在函数的其它地方实现
        int SetAge(int age) {
	        // 参数合法性限制
        	if(age < 0 || age > 200 ) return;
        	m_age = age;
        };
    private:
        int m_age;
        char m_name[32];
};
#endif

如果某些属性不想被外部修复访问、则可以设置成private 关键字,继续保护

不过类提供一种机制来实现内部成员变量的修改和访问,就是通过·public· 声明的函数,来供类外部进行访问,修改。

面向过程 | 对象

  • 面向过程

    • 数据结构 + 算法
    • 用户需求简单而固定
    • 特点:
      • 分析解决问题所需步骤
      • 利用函数实现各个步骤
      • 依次调用函数解决问题
  • 面向对象程序设计 【 由现实世界建立软件模型 】

    • 属性:静态特征,可以用某种数据来描述
    • 方法:动态特征,对象所表县的行为或者具有的功能
      将现实世界的事物直接映射到程序中,可直接满足用户需求
    • 特点
      • 直接分析用户需求中设计的各个实体
      • 在代码中描述现实世界中的实体
      • 在代码中关联各个实体协同工作解决问题
    • 优势:
      • 构建的软件能够适应用户需求的不断变化
  • 面向对象三大特征

    • 封装
      • 将变量(属性)个函数(操作)合成一个整体,封装在一个类中
      • 尽可能屏蔽对象的内部细节,对外形成一个边界,值保留有限的对外接口使之与外部发生联系
    • 继承
    • 多态

参考文章

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/570906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux gcc day7

动态链接和静态链接 形成的可执行的程序小&#xff1a;节省资源--内存&#xff0c;磁盘 无法c静态库链接的方法 原因是我们没有安装静态c库&#xff08;.a&#xff09; 所以要安装 sudo yum install -y glibc-static gcc static静态编译选项提示错误&#xff1a;/usr/lib/ld:ca…

9.Eureka服务发现+Ribbon+RestTemplate服务调用

order-service服务通过服务名称来代替 ip:port的方式访问user-service服务的接口。 原来的请求代码&#xff1a; Service public class OrderServiceImpl implements OrderService {Autowiredprivate OrderMapper orderMapper;Autowiredprivate RestTemplate restTemplate;Ov…

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

入门指南:网站UI原型设计的简单方法

从零开始做网站UI原型设计&#xff0c;真的很有成就感&#xff01;那么&#xff0c;UI设计师从零开始做网站UI原型设计需要经历哪些过程呢&#xff1f;设计网站UI原型的第一步&#xff1a;绘制网站线框。本文将主要分为两个阶段&#xff1a;网站线框和原型绘制。 如何制作网站…

Mysql联合索引和最左匹配例子说明

文章目录 前言联合索引最左匹配原则举例说明 前言 是什么是索引&#xff1f; 索引是一种数据结构&#xff0c;用于加速数据库查询。 当没有索引时&#xff0c;数据库系统需要执行全表逐行扫描来满足查询需求。这意味着它会逐行读取整个表中的数据&#xff0c;并在内存中进行比…

最快2周录用!多领域EI,征稿范围广!各指标优秀!

计算机工程类EI&#xff08;最快2周录用&#xff09; 【期刊简介】最新EI期刊目录内源刊 【检索情况】EI&Scopus双检 【版面情况】仅10篇版面 【年发文量】60篇左右 【国人占比】约13% 【收录年份】2009年被EI数据库收录 【审稿周期】预计1个月左右录用 【征稿领域…

【WSL】单机大模型前的基础环境配置

前言&#xff1a;在上一篇文章中&#xff0c;我们完成了WSL的部署&#xff0c;但是在大模型搭建&#xff08;尤其是Langchain&#xff09;前&#xff0c;还碰到了不少的坑&#xff0c;查找了不少的文章&#xff0c;所以本篇文章就做一个记录&#xff0c;避免以后再走冤枉路。 …

【置顶】ARMv8/ARMv9架构入门到精通-[目录]--backup-20240424

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448;联系方式-加入交流群 ---…

Java基础入门1-2

跟着韩顺平老师的30天入门java课程学习&#xff0c;整理一下自己的笔记&#xff0c;方便回顾知识点和复习。 另附上视频链接&#xff1a;0034_韩顺平Java_变量原理_哔哩哔哩_bilibili 第一章&#xff1a;学习前的了解 第二章&#xff1a;Java概述 2.1什么是程序&#xff1f…

韩国机器人公司Rainbow Robotics推出RB-Y1轮式双臂机器人

文 | BFT机器人 近日&#xff0c;韩国机器人领域的佼佼者Rainbow Robotics揭开了RB-Y1移动机器人的神秘面纱&#xff0c;这款机器人以其创新的设计和卓越的功能引起了业界的广泛关注。与此同时&#xff0c;Rainbow Robotics还携手舍弗勒集团&#xff08;提供汽车、工业技术服务…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2013B 3.部分核心程序 .............................................................................. %我们这里…

如何部署 wfs 分布式服务

说明&#xff1a; wfs是海量小文件存储系统。wfs1.x不直接支持分布式存储&#xff0c;但为了应对大规模部署和高可用需求&#xff0c;推荐采用如Nginx这样的负载均衡服务&#xff0c;通过合理的资源配置和定位策略&#xff0c;可以在逻辑上模拟出类似分布式的效果。也就是说&am…

ROC和AUC

什么是ROC和AUC ROC曲线&#xff08;Receiver Operating Characteristic curve&#xff09;和AUC&#xff08;Area Under the Curve&#xff09;是用于评估二分类模型性能的重要工具。 ROC曲线以真正例率&#xff08;True Positive Rate&#xff0c;也称为召回率或灵敏度&…

【Java--数据结构】提升数据处理速度!深入理解Java中的顺序表机制

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 两种创建顺序表的方法及区别 认识ArrayList的构造方法 不带参数的构造方法 带参数的构造方法 利用Collection 构造方法 举例 ArrayList 常用方法演示 add addAll remo…

Docker容器搭建Hadoop集群(hadoop-3.1.3)

Docker容器环境下搭建Hadoop集群&#xff08;完全分布式&#xff09; hadoop版本为hadoop-3.1.3 &#xff08;1&#xff09;安装额外的速度较快的镜像库 yum install -y epel-release &#xff08;2&#xff09;安装同步工具&#xff0c;方便在多台服务器上进行文件的传输 …

LLM - 大语言模型(LLM) 的 评估体系

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/138160155 大语言模型(LLM)的评估是复杂且多维的过程,涉及多个方面,包括评估体系、评估方法、评估实践。评估体系包括评估数据集、模型输出、样本/输出变换…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一&#xff0c;队列的概念 队列是一种特殊的受限制的线性表。 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的t&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIF…

Day16-Java进阶-线程通信线程生命周期线程池单例设计模式

1. 线程通信 1.1 线程通信介绍 1.2 两条线程通信 package com.itheima.correspondence;public class CorrespondenceDemo1 {/*两条线程通信*/public static void main(String[] args) {Printer1 p new Printer1();new Thread(new Runnable() {Overridepublic void run() {syn…

机器学习运用-民宿价格

项目简介 随着旅游业的蓬勃发展&#xff0c;民宿市场迎来了前所未有的增长机遇。正好最近在参加拓尔思数据挖掘公益实习活动&#xff0c;我的项目将应用机器学习技术开发一个价格预测模型。可以达到更好地理解和预测民宿价格的目的&#xff0c;该模型综合考虑了从容纳人数、便…

【Java】文件操作(一)

文章目录 ✍一、文件的基本认识1.文件是什么&#xff1f;2.文本文件和二进制文件3.文件权限4.相对路径和绝对路径1.1绝对路径1.2相对路径 ✍二、文件的基本操作1.FIle的属性2.File的构造方法3.File类的方法3.1File类的获取操作3.2File类的判断操作3.3文件创建和删除3.4其他的常…