C++笔记

C++语法解析

C++基础语法
1每条语句以 ; 结束
2大小写敏感,即std::cout STD::cout 互不相同
3文字(字符串)放在双引号内 “这是文字”
45. /* 注释区域 */ 包裹的内容全部注释
5控制台程序是由main函数开始执行的
6#include 是一条预处理指令
7关键字是C++中含有特殊意义的保留字符 如: int

示例:

#include <iostream>
//预处理指令 导入C++输入输出流头文件  
//注释 主要起到说明作用是给程序员看的


int main(){   
    
    std::COUT;       //错误写法C++中区分大小写
	std::cout<<"这是字符串"; 
    int a;float b;        
    /* int float...等是C/C++中的关键字*/
}


C++基础指令

思考

std::cout<<"/*这是注释*/"; //这是注释

常用基础命令

函数(指令名)功能示范
printf控制台上显示文字printf(“要显示的内容”)
system执行系统命令system(“pause”); //暂停

特殊字符显示

字符显示结果
“\\”\
“\”"‘’
"\’ "
“\n”换行

示例

int main(){ 
    std::cout << "这是一个测试,关于printf!\n \'\'"; //c++    
    system("pause");    
    system("cls"); //清屏       
    printf("这是一个测试,关于printf!\n测试人员姓名:\"Xinux\"");
}
    
    

计算机基础知识

计算机主要元器件

处理器(CPU)内存(memory)硬盘(Hard disk)键盘/鼠标显示器主板(mainboard)
运算内部存储器外部存储器输入设备输出设备计算机最基本也是最重要的部件之一

函数

头文件和源文件

当我们需要分工时,就避免不了多个源文件与头文件的问题

image-20210916120612220

我们添加一个test1.cpp源文件时,可能会有其他的源文件调用test1.cpp中的函数或功能,我们就可以再新建一个test1.h头文件用来放test1.cpp中的函数或功能的 声明 (注意是声明哦) 再将其他源文件想调用test1.cpp中功能的源文件 ,包含我们自己创建的"test1.h"头文件

image-20210916120745447

头文件不会编译

image-20210916120801503

针对多个头文件嵌套问题,声明只有一次,而定义有N次

如果要引用的变量在所有源文件中均有效,就需要在头文件中加入extern关键字,在test1.cpp中声明,或者其他源文件中声明使用都可以。此时使用的是一块内存地址

image-20210916120821761

内联、静态函数只在各自的源文件中有效,静态变量也是。意思也就A的源文件中定义变量为200,那么在B源文件中就需要重新定义,在A源文件中的定义无效,因为从汇编的角度看指向的地址不是同一个地址

image-20210916120840793

其他情况:

假设我们又添加了一个项目,而这个项目又需要我们之前的头文件

  • 找到原项目所在头文件的路径
  • 复制需要的头文件和源文件
  • 找到自己项目的路径拷贝过去
  • 在现项目中右键源文件->[添加现有项] 选择需要的文件
  • 包含头文件 #include “emath.h” 即可

image-20210916120858169

image-20210916120917126

头文件多次重定义

可以使用一下方式解决

#pragma once //关键字 在多次嵌套头文件时保障只引用一次
			 //有弊端 在不同的编译器下支持不同

#ifndef _HOPEN_    //定义宏开关 
#define _HOPEN_    //如果没有定义该宏则定义宏并执行代码块
				   
...代码段

#endif   	       //ifndef 用endif结尾

extern(C/C++中的代码混用问题)

C/C++代码混用,C和C++的函数调用方式不同,C++支持函数重载,C不支持。

  • 1.在头文件中用extern关键字声明

image-20210916120938908

  • 2.头文件中用extern关键字声明多个C风格函数

image-20210916120956056

3.在C++源文件中包含头文件时声明

image-20210916121011406

而再当C文件去调用的时候我们又不需要extern关键字了,为解决这个问题,又推出一个新的方法,就是__cplusplus关键字,__cplusplus这个关键字只有C++能识别:

test1.h
    
#pragma once
#ifdef __cplusplus
extern "C"    //当时C++源文件调用头文件时就会读取该关键字,让编译器认识这是一个C风格的函数
#endif
    
int xxx();  //而C源文件调用该头文件时,它不识别__cplusplus关键字,就会引用这种方式

C语言中不支持函数重载:

#ifdef __cpluscplus
extern "C"
{
#endif
    
    int ave();  //这种写法就可以在头文件写多个函数了,无论是C/C++调用时都可以有效的处理
    int sun();
    
#ifdef __cpluscplus
}
#endif

image-20210916121034856

C和C++源文件混用的问题

C和C++源文件混用的问题以及LNK4042错误

LNK4042对象被多次指定;已忽略多余的指定 externCC++

  • 这种情况是因为C和C++文件名重复,修改即可

image-20210916121053277

创建自己的SDK

站在食物链顶端,让众生在我的生态下存货,要学会自己去创造,不要老用别人的

创建功能性源码

先简单的创建两个文件,一个源文件一个头文件,在头文件中写声明,源文件中用命名空间来写其具体功能实现

image-20210916121111926

image-20210916121124365

生成静态lib库

右键[项目 选择 [ 属性 ] 中 [配置属性 > 常规 > 配置类型] 中 选择 lib

image-20210916121143524

应用之后 再次生成 即可

image-20210916121158995

找到lib文件 和 头文件 打包就可以给别人用了

image-20210916121214625

手动使用lib库配置(目前还不会自己写exe文件自动执行)

右键工程 属性 VC++目录 - [包含目录和库目录] 将lib所在路径填到后面,主要 ; 号间

image-20210916121234264

在代码中引入头文件 和 库 就可以使用我们之前的做好的SDK了

image-20210916121249746

直接include <xinux.h>方式

​ 右键属性 -> 链接器 -> 输入 -> [附加依赖项] 加上我们自己的lib文件 就可以通过’#include <xinux.h> 一个操作即可使用我们的SDK

image-20210916121308202

创建自己的项目模板

image-20210916121327410

项目 -> 导出模板 后会自动生成一个zip文件

image-20210916121341206

在目录下会自动生成一个zip文件 那个就是模板了 将该文件放入 对应目录中

image-20210916121358744

image-20210916121413945

函数调用约定

__cdecl

__cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。由于由调用者清理栈,所以允许可变参数函数存在,如int sprintf(char* buffer,const char* format,…);。

__stdcall

__stdcall 很多时候被称为 pascal 调用约定。pascal 语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨。参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。

__fastcall

顾名思义,__fastcall 的特点就是快,因为它通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。

naked
naked 是一个很少见的调用约定,一般不建议使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是,你不能用return返回返回值,只能用插入汇编返回结果,此调用约定必须跟 __declspec 同时使用。例如定义一个求和程序,如__declspec(naked) int add(int a,int b);。

__pascal

这是 pascal 语言的调用约定,跟 __stdcall 一样,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。VC 中已经废弃了这种调用方式,因此在写 VC 程序时,建议使用 __stdcall 代替。

__thiscall
这是 C++ 语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this 指针存放于 ECX 寄存器,函数自身清理堆栈;如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理栈。__thiscall 不是关键字,程序员不能使用。参数按照从右至左的方式入栈。

类 (OOP)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值