C++学习(1)
一、C++概述(了解)
C++在C语言的基础上添加了面向对象编程和泛型编程的支持
二、helloword程序(掌握)
#define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报警告和错误,导致无法编译通过。
#include <iostream>//引入头文件
using namespace std;//标准命名空间
int main()
{//C++在C语言的基础上添加了面向对象和泛型编程的支持//cout是标准的输出流对象,打印字符串//endl是刷新缓冲器,并换行cout << "helloword"<<endl;system("pause");//意思就是让程序暂停一下,然后按任意键继续,初学的时候最多见于程序的末尾处,用于看运行结果,避免程序一闪而过。return 0;
}
三、面向对象的三大特性(了解)
封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏(把函数和变量写在类里面,并给他们权限)
继承 继承所表达的是类之间相关的关系,这种使得对象可以继承另外一类对象的特征和能力。减少代码和数据冗余
多态 一个接口,多个方法
四、命名空间
1.为什么有命名空间:是因为解决多人合作是取标识符是重命名(名称冲突)的问题
2.什么是命名空间:
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
namespace A {//命名空间,A是空间的名字int a;void func() {}
}
namespace Maker {int a;namespace B{int b;}
}
namespace Maker {//这个Maker和上面的Maker是一个命名空间int c;
}
int main()
{system("pause");return 0;
}
命名空间的注意
1.命名空间只能写在全局
2.命名空间可以嵌套命名空间
3.命名空间是开放,随时可以加入新成员,但是新成员只能在加入后使用
4.匿名的命名空间
5.命名空间可以取别的名字
6.分文件编写代码时,如果.h中有两个命名空间,但是里面的成员函数或者成员变量同名时,在.cpp中实现函数时,需要加上命名空间;
头文件
#pragma once
//.h 和.cpp的区别
// 函数的 .h声明 .cpp实现
//一、用法不同
//1、.h文件直接#include到需要的.cpp文件里,就相当于把.h文件的代码拷贝到.cpp文件
//2、.cpp文件需要先自己生成.o文件,把不同.o文件连接生成可执行文件。
//比如有3个cpp文件:a.cpp、b.cpp、c.cpp,其中一个包含main()函数,需要生成test程序,
//步骤:
//(1)生成3个.o文件:
// cc - c a.cpp
// cc - c b.cpp
// cc - c c.cpp
// 这样就得到3个.o文件:a.o、b.o、c.o
// (2)链接生成test程序:cc - o test a.o b.o c.o
// 就得到test可执行程序,输入. / test就可执行程序了。
// 二、规范不同
// 1、h文件一般包含类声明;
// 2、cpp文件一般为同名h文件定义所声明的类函数。
// 说明:一般可在cpp文件直接添加main()就可以测试该模块功能。
#include<iostream>
using namespace std;
namespace myMaker1 {//int ma;//定义变量会报错,在.cpp中引入.h相当于将.h中的文件复制过去,所以就存在ma多次定义了,出现变量MM重复的问题;void func();
}
namespace myMaker2 {void func();
}
class test
{
};
源文件
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
#include "03test.h"
using namespace std;
//using 声明可使得指定的标识符可用
void test() {cout << "namespace Maker c" << Maker::c << endl;
}
namespace Maker {int c = 100;namespace B {int b = 200;}
}void test01(){//新名字 旧名字namespace nameMaker = Maker;//在合作项目当中别人的命名空间和你的一样的时候,你可以给自己的命名空间取别名cout << nameMaker::B::b << endl;
}
void test1() {cout << "namespace Maker c" << Maker::c << endl;
}
//类似与static int d=50;只允许该文件使用的变量
namespace {int d=50;
}
int mya = 10;//C语言中局部变量存在栈里,全局变量存静态存储区。
//局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
//全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
int main()
{int mya = 20;//就近原则cout << "mya=" << mya << endl;//20cout << "::mya" << ::mya << endl;//10cout << "namespace Maker c" << Maker::c << endl;//::作用域运算符 用来访问某个作用域里面的成员cout << Maker::B::b << endl;cout << d << endl;//50//test1();//会报错,因为声明命名空间在函数之后test1();//代码变为可执行程序的四步:预处理 编译 汇编 链接(报错中出现无法解释的外部命令说明链接出现了问题)myMaker1::func();//myMaker1为头文件中的命名空间system("pause");return 0;
}
//两个同名的变量,一个全局变量一个局部变量,那局部变量在前期作用域具有较高的优先权,它能屏蔽全局变量
五、using声明和编译指令(重点)
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;//要使用iostream就要将对应的命名空间引入
namespace A
{int a = 10;int b = 20;int c = 30;
}
void test01() {//using声明是让命名空间中某个标识符可以直接使用,就等于直接把int a = 10;给替换过来,就成为了局部变量using A::a;cout << a<<endl;//int a = 50;//注意:using声明了某个变量,在该作用域不能定义同名的变量
}
void test02()
{//using编译指令,让某个命名空间的标识符都可以直接使用using namespace A;cout << a << endl;cout << b << endl;cout << c << endl;int a = 100;//为什么不会冲突;//类似于命名空间中的a是全局变量,此处的a是局部变量cout << a << endl;
}
int main()
{test01();test02();system("pause");return 0;
}
六、struct类型加强(重点)
加强一 c中定义结构体需要加上struct关键字,C++不需要
加强二 c中结构体中只能定义成员变量,不能定义成员函数。C++既可以定义成员变量也可以定义成员函数
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//加强一
//这是自定义的数据类型
struct Maker//没有分配空间,因为这只是一个数据类型
{char name[64];int age;
};
void test01() {//int 只是一个数据类型,只写int没有分配空间Maker a;//这时候才进行分配命名空间,不需要加struct就可以定义变量}
//加强二
struct Maker2
{int a;void func() {//结构体内可以写函数cout << "func" << endl;}
};
void test02(){Maker2 a2;a2.func();
}
int main()
{test01();test02();system("pause");return 0;
}
七、更严格的类型转换(了解)
不能隐式转换,必须是显示的转换
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{//不能进行隐式转换,只能进行显示转换//char* p = malloc(64);//报错;c中是可以这样写的但是C++数据类型是比较严格的char* p = (char*)malloc(64);//malloc返回的是void * malloc分配的内存大小至少为参数所指定的字节数system("pause");return 0;
}
八、三目运算符(了解)
C++案例
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test()
{int a = 10;int b = 20;(a > b ? a : b) = 100;//C语言的三目运算符返回的是右值//C++的三目运算符返回的是左值是空间cout << "a=" << a << endl;cout << "b=" << b << endl;
}
int main()
{test();system("pause");return 0;
}
C案例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test()
{int a = 10;int b = 20;printf("%d\n", a > b ? a : b);//( a > b ? a : b)=100//错误//这个表达式返回的右值是数值,返回的是20//20=100*(a > b ? &a : &b) = 100;printf("b=%d\n", b);
}
int main()
{test();return 0;
}
九、C/C++的const(重点)
const变量为常量,不能直接修改,可以间接修改。
C++案例
C++语言的const修饰的变量有时候有空间,有时候没有空间(发生常量折叠,且没有对变量进行取地址操作)
C++语言中const修饰的全局变量具有内部链接属性,只能在当前文件使用。要使用外部链接的话两侧都加extern即可
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
const int a = 100;//没有内存
void test()
{//发生了常量折叠cout << "a:" << a << endl;//在编译阶段,编译器cout << "a:" << 100 << endl; 速度更快cout << "&a:" << &a << endl;//volatile禁止优化volatile const int bb = 20;//栈区int* p = (int*)&bb;//进行了取地址操作,所以有空间*p = 2000;cout << "bb:" << bb << endl;//优化的时候为20 编译器直接修改cout << "bb:" << 20 << endl; 编译器的问题 添加volatile后为2000cout << "*p" << *p << endl;//2000cout << "bb的地址" << (int)&bb << endl;cout << "p指向的地址" << (int)p << endl;
}
int main()
{test();system("pause");return 0;
}
C++编译器不能优化数据的情况
1.如果用变量给const修饰的局部变量赋值,那么编译不会优化
2.不能优化自定义数据类型
#define _CET_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test() {int a = 10;const int b = a;int *p = (int *)&b;*p = 100;cout << "b=" << b << endl;cout << "*p=" << *p << endl;
}
//自定义数据类型,编译器不能优化
struct Maker{Maker(){//构造函数a = 100;}int a;
};
void test02(){const Maker ma;//实例化对象,并初始化acout << ma.a<<endl;Maker *p = (Maker *)&ma.a;p->a=200;cout<<ma.a<<endl;//没有优化,因为不能优化自定义数据类型
}
int main()
{//test();test02();system("pause");return 0;
}
C案例
全局的const不能直接修改也不能间接修改
局部的const不可以直接修改但是可以间接修改
C语言的const修饰的全局变量具有外部链接(extern)属性
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int a = 10;//常量区,一旦初始化,不能修改
int main()
{//C语言的const修饰的变量都有空间不能直接修改全局常量//a = 200;也不能间接修改全局常量//int *p = (int*)&a;//*p = 100;//printf("%d\n",a);const int b = 20;//栈区//b = 200;//不能直接修改局部常量int *p = &b;//可以间接修改局部常量*p = 200;printf("%d\n", b);//使用别的文件的全局const修饰的变量需要声明extern const int c;//C语言的const修饰的全局变量具有外部链接属性printf("%d\n", c);system("pause");//让程序暂停一下return 0;
}
相关文章:
C++学习(1)
一、C概述(了解) C在C语言的基础上添加了面向对象编程和泛型编程的支持 二、helloword程序(掌握) #define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报…...
机器人如何有效采摘苹果?
摘要:本文利用动捕数据构建拟人运动模型,对比观察两种苹果采摘模式,并对系统性能进行全面评估,为提高机器人采摘效率提供创新方法。 近期,一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…...
C# OpenCvSharp Yolov8 Detect 目标检测
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Open…...
rust数组
一、定义数组 (一)一维数组 1.指定所有元素 语法格式 let variable_name: [dataType; size] [value1,value2,value3];例如 let arr: [i32; 4] [10,20,30,40];2.指定初始值和长度 所有元素具有相同的值 语法格式 let variable_name: [dataType; siz…...
ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN
CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…...
JAVA学习笔记
一、学习要点 java的最大优势就是跨平台; java的三个版本,javaSE标准版本,javaEE企业版本,javaME微型版本(用的比较少); JVM(Java Virtual Machine,Java虚拟机); JRE…...
车载软件架构 —— 持续集成持续交付
车载软件架构 —— 持续集成持续交付 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…...
c++ 二元运算符重载, 以加法为例
/* * c 二元运算符重载, 以加法为例 */ #include <stdio.h> class Complex { public: int r0; // real, 实部 int v0; //virtual, 虚部 }; // 重载加法 操作符 // 可见,c2元运算符,取其左侧为第一参数,右侧为第二参数 // 返回值可以付给新的变量 C…...
基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库
文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统,是基于 Java SpringBoot 开发的。主要包括二大功能模块,即用户功能模块和管理员功能模块。 (1)管…...
Docker实战技巧(二):Kubernetes基础操作实战
Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用 systemctl stop firewalld systemctl disable firewalld 2、配置repo cd /etc/yum.repos.d/ 下载Docker repo wget https://mirrors.aliyun.com/docker-…...
计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】
目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成(image caption generation)视频处理 序列到序列学习:输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是,将“机器学习”四个字都学…...
Centos7安装wps无法打开及字体缺失的问题解决
在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm,生成了桌面图标并信任,可以新建文件,但是软件无法打开。在终端执行如下命令,用命令行启动wps: cd /opt/kingsoft/wps-office/office6/ ./…...
华为OD机试真题-会议接待-2023年OD统一考试(B卷)
题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1、一个团只能上一辆车,并且代表团人数(代表团数量小于30,每个代表团人数小于30)小于…...
mysql explain学习记录
参考了公司内相关博客,实践并记录下,为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。 每当遇到执行慢(在业务角度)的SQL,…...
电压放大电路的作用有哪些(电压放大器)
电压放大电路是电子电路中常见且重要的组件,其主要作用是将输入信号的电压放大到所需的输出电压级别,并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中,具有以下几个重要的作用: 信号放大:电…...
编译opencv-3.4.5 [交叉编译]
在unbuntu20.04环境下编译opencv3.4.5, cmake 版本:3.27.4 gcc 版本:11.4.0 g版本:11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 (1) Built target libprotobuf make: *** [Makefile:163…...
Canal 实现MySQL与Elasticsearch7数据同步
1 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…...
网络安全攻防对抗之隐藏通信隧道技术整理
完成内网信息收集工作后,渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 (一)隐藏通信隧道概述 一般的网络通…...
读书笔记:多Transformer的双向编码器表示法(Bert)-2
多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers,即Bert; 第2章 了解Bert模型(掩码语言模型构建和下句预测) 文本嵌入模型Bert,在许多自然语言处理任务上表现优秀&#…...
Python 基于PyCharm断点调试
视频版教程 Python3零基础7天入门实战视频教程 PyCharm Debug(断点调试)可以帮助开发者在代码运行时进行实时的调试和错误排查,提高代码开发效率和代码质量。 准备一段代码 def add(num1, num2):return num1 num2if __name__ __main__:f…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
