程序设计 基础篇

11.1之前1—12 指针之前
11.113-20 拷贝构造函数之前
### 一、赋值运算符
  • 简单赋值
 int a(868);int a= 868;//a(868) == a=868double a,s,d,f = 1.25;//可以同时定义多个同类型变量,且可给变量赋值
  • 复合赋值
x+=y;//x = x+y;
//+= -= *= /= %=  => x = x _ y 
  • 赋值表达式总是先将右边的操作数或者表达式进行计算后,将计算结果赋给左边的变量。
x = y+z ; // 先y+z ,再将和的结果赋给x
  • 在一个表达式中当连续使用多个赋值运算符时,运算顺序为从右向左
x=y=z=0;//先z=0; 再将z的值赋给y; 最后将y的值赋给x

二、自增自减预算符

++i; --i;//先运算+1/-1 再参加运算
i++; i--;//先参加运算 再+1/-1
-------------------------------------
int i , j ;
i = 2 ; j = 4;
cout << i++ << "" <<--j <<"";
cout << i << "" << j <<endl;
//输出结果为 
//2 3  =>  i先参加运算输出,再自加 ,j先自减,再参加运算输出
//3 3
-------------------------------------
int x = 5 , y = 10;
x = --y-5;
cout << x << "" << y << endl;
//输出结果为
//4 9 =>--y-5 => (--y)-5 => 9 - 5 = 4

三、关系运算符

  • 大于> 小于< 大于等于>= 小于等于<= 等于== 不等于!=
  • 当关系式成立时为1,反之为0
int a , b(1) , c(-1) , d(1);
a = ((b+c)>=d);
cout << a << "" <<endl;
//输出结果为
//0 => 先执行b+c=0 ,再执行(b+c)>=d,由于0 >= 1不满足,所以a = 0。
  • 注意a == b 和 a = b,在手写代码时别搞混!!

四、逻辑运算符

  • 与&& 仅左右两边同时为1时,为1 。
  • 或|| 左右两边至少有一个为1,则为1。
  • 非! 取反,右边为1,得到0,反之亦然。
  • 一个逻辑表达式中有可列个&& 和 || ,从左到右进行运算。
int x = 0 , y = 1 ,z;
z = x++ && y--;
cout << x << "" << y << "" << z <<endl;
//输出结果为
//错误:1 0 1 => (x++) , x=1 => 1 && y=1 => z = 1 => y-- , y = 0
//正确:1 1 0 => x先参与计算再自加1 => 因为x = 0 &&的结果肯定为0,所以y--不运行 =>x = 1 , y = 1 , z = 0
  • 逻辑表达式运算时,若已能判断表达式值,整个过程将提前结束,这种现象称为 逻辑短路,如上例子。

五、条件运算符

  • e1 ? e2 : e3; e1满足执行e2,e1不满足执行e3。

六、 逗号运算符

  • 形式: e 1 , e 2 , e 3 . . . , e n e_1,e_2,e_3...,e_n e1,e2,e3...,en
  • x = ( e 1 , e 2 , e 3 . . . , e n ) x = (e_1,e_2,e_3...,e_n) x=(e1,e2,e3...,en)对于所有的 e i e_i ei表达式从左到右开始计算直到 e n e_n en,最后将 e n e_n en的值赋给x。
int a, b = 2,c = 5;
a = (b++, c -= 3 , b+=c , b-c);
cout <<a <<"" <<b<<""<<c <<"" <<endl;
//输出结果为
//3 5 2 => b++ , b=3 => c=c-3 , c=2 => b=b+c , b=5 => b-c=3 , a=3

七、 求字节运算符

  • sizeof(e),求得e所占用字节数。
  • double 求出为8 ; float int 求出为4 ;double*float = double

八、if语句

九、switch语句

switch(表达式){case a1: 语句块1 (break;)...case an: 语句块n (break;)(default: 语句块  (break;))
}
//a1 an 为不同得常量
//default 语句可有可无,可以放在任意位置,一般放最后
  • switch语句中,如果case语句中没有break,则继续向下执行后一个case语句,直到遇到break或者switch语句结束。

十、三大循环 for while do-while

  • for (e1; e2; e3) {
    // 循环体
    }

  • 其中e1为循环变量赋值 ,e2判断是否循环 ,e3修改循环条件中得变量 ,e2可以为空。

  • e1 → e2(如果为真) → 循环体 → e3
    重复:e2(如果为真) → 循环体 → e3
    一直到 e2 为假,退出循环。

  • while(表达式) 当表达式不满足或者循环体中遇到break,停止循环。

  • do
    循环体
    while(表达式) 先执行循环体,后判断表达式是否非0,若非0继续执行循环体,直至表达式为0。

  • do-while循环至少循环一次。

十一、两大跳转

  • break;
  • switch语句下,跳出case,结束当前循环。
  • 多重循环下,跳出当前循环体,不跳出外套循环。
  • continue;
  • 退出当前循环,下一次该循环还是循环。

十二、数组

  • 二维数组
int a[2][3] = {{1,2,3},{4,5, 6}};
int a[2][3] = {1,2,3,4,5,6};
//上面两个等价
//如果{}里面的元素个数 < m*n,则多出来的空间均为0

十三、 指针

//形式:类型名 *标识符
DLNode *p;
int q , *p;
p = &q;	//&取变量地址的运算符,所以p指向的是q的地址
*p = 6;//*取指针变量 所指内容的原算符,即取p指向地址的内容,即q的内容,q的值为6,所以*p的内容是6

十四、 函数调用

  1. 传值调用int a
    func.被调用时,为形参分配空间 同时 将实参copy给形参,在func.中执行时只访问形参 而与实参无关,故而形参变化不影响实参的值。
    e.g.
    main()中调用void swap(int a,int b);的语句为swap(x,y);
    在main中调用前调用后的xy值不变,他是实参;
    在swap中的输出就是a = y b = x因为swap了,ab是形参
  2. 传地址调用int *a
    func.被调用时,把实参地址copy给形参的指针,这样在函数执行时改变了形参内容指针的同时,也更改了实参所指的内容,故而通过该边形参所指变量而改变了实参。
    e.g.
    main()中调用**void swap(int a,int b);的语句为swap(&x,&y);
    在main中调用前调用后的xy值变,即形参的改变会导致实参的改变。
  3. 传引用调用int &a
    使用引用作为函数参数,在形参面前加&,与传地址作用相似,在改变形参的同时也改变了实参的值
    e.g.
    main()中调用void swap(int &a,int &b);的语句为swap(x,y);
    在main中调用前调用后的xy值变,即形参的改变会导致实参的改变。

十五、作用域与生存期

作用域是关于变量能在哪些地方使用,访问的范围
生存期是关于变量何时分配和释放,即变量在内存中的存在时长

作用域:块作用域,从块中对某变量的定义开始,直至块对应的} 为止。
生存期:静态变量static,与整个程序的作用期相同。

作用域符声明位置生存期
局部变量函数体内 程序块内函数或块被执行时存在 函数调用或块结束时释放
内部静态函数体内初始化一次,直至程序结束
外部静态函数体外从声明处开始,直到所在源程序文件结束
全局变量函数体外从声明处开始,一直到程序结束

局部变量:局部变量是在函数或代码块中声明的变量,只在所在的代码块内有效(作用域),当函数调用或代码块结束时会被释放(生存期)

#include <iostream>
void exampleFunction() {int localVar = 5;  // 局部变量std::cout << "局部变量 localVar = " << localVar << std::endl;
}  // localVar 的作用域到这里结束,生存期也随之结束int main() {exampleFunction();// std::cout << localVar;  // 错误,localVar 超出了作用域return 0;
}

内部静态:内部静态变量是在函数内部声明的 static 变量作用域仍在函数内,但生存期是整个程序运行期间,即函数每次调用时,该变量不会被重新分配和释放

#include <iostream>
void exampleFunction() {static int staticVar = 0;  // 内部静态变量,只初始化一次staticVar++;std::cout << "内部静态变量 staticVar = " << staticVar << std::endl;
}int main() {exampleFunction();  // 输出 1exampleFunction();  // 输出 2return 0;
}

外部静态:外部静态变量在文件作用域声明,但只在该文件中可见。它的作用域从声明位置到文件末尾,生存期为整个程序运行期间

#include <iostream>static int fileStaticVar = 10;  // 外部静态变量,只在当前文件中可见void exampleFunction() {std::cout << "外部静态变量 fileStaticVar = " << fileStaticVar << std::endl;
}int main() {exampleFunction();  // 输出 10return 0;
}

全局变量:全局变量在文件作用域中声明,可以在程序的其他文件中【和外部静态变量区别】 通过 extern 声明来访问。它的生存期是整个程序运行期间作用域从声明位置到程序结束

#include <iostream>int globalVar = 100;  // 全局变量void exampleFunction() {std::cout << "全局变量 globalVar = " << globalVar << std::endl;
}int main() {exampleFunction();  // 输出 100return 0;
}

十六、作用域分辨符 :: 😃

作用域分辨符 的目的是引用全局变量 =>【::value和value不同!!】

#include <iostream>int value = 42;  // 全局变量void displayValues() {int value = 10;  // 局部变量,与全局变量同名std::cout << "局部变量 value = " << value << std::endl;std::cout << "全局变量 value = " << ::value << std::endl;  // 使用作用域分辨符访问全局变量
}int main() {displayValues();return 0;
}
//输出结果
局部变量 value = 10
全局变量 value = 42

十七、类的访问控制

class 类名{
public: 公有成员或公有成员函数
private: 私有成员或私有成员函数
protected: 保护成员或者保护成员函数
};
类的访问控制访问权限
public公有成员变量,可以在类外直接访问
private私有成员变量,类外无法直接访问
protected护成员变量,类外无法直接访问,派生类可访问
//AI生成
#include <iostream>
using namespace std;class Example {
public:int publicVar;  // 公有成员变量,可以在类外直接访问Example(int pub, int pri, int prot) : publicVar(pub), privateVar(pri), protectedVar(prot) {}void publicFunction() {  // 公有成员函数,可以在类外直接访问cout << "这是一个公有成员函数。" << endl;cout << "访问私有成员变量 privateVar: " << privateVar << endl;}private:int privateVar;  // 私有成员变量,类外无法直接访问void privateFunction() {  // 私有成员函数,类外无法直接访问cout << "这是一个私有成员函数。" << endl;}protected:int protectedVar;  // 保护成员变量,类外无法直接访问,派生类可访问void protectedFunction() {  // 保护成员函数,类外无法直接访问,派生类可访问cout << "这是一个保护成员函数。" << endl;}
};class Derived : public Example {
public:Derived(int pub, int pri, int prot) : Example(pub, pri, prot) {}void accessProtected() {cout << "派生类访问基类的保护成员变量 protectedVar: " << protectedVar << endl;}
};int main() {Example example(1, 2, 3);// 访问公有成员example.publicVar = 10;cout << "公有成员变量 publicVar: " << example.publicVar << endl;example.publicFunction();// 尝试访问私有和保护成员(会报错)// example.privateVar = 20;      // 错误:无法访问私有成员// example.protectedVar = 30;    // 错误:无法访问保护成员// 派生类访问保护成员Derived derived(1, 2, 3);derived.accessProtected();return 0;
}

十八、构造函数、析构函数

构造函数、析构函数是类中两种特殊的成员函数
构造函数主要用于对象分配空间以及对对象的数据成员进行初始化
析构函数主要用于释放对象及各语句所占的存储空间

  • 构造函数的特点:
    • 没有返回值类型:int char func()这些前缀没有
    • 函数名与类名相同:class 类名{ 类名(){}}
    • 参数可以有可列个,可重载
    • 可带一个成员初始化列表,写在形式参数列表的右圆括号之后、函数体的左花括号之前,用一个冒号开始。
    • 构造函数可写可不写,不写 类会自动生成
class MyClass {
private:int a;const int b;
public:MyClass(int x, int y) : a(x), b(y) { // 使用成员初始化列表初始化 a 和 b// 构造函数体}
};
  • 调用构造函数:
    • 对象定义
    • new类名或者new类名[长度]调用缺省构造函数
    • new类名调用构造函数
    • 类名调用构造函数
  • 析构函数的特点:
    • 函数名在类名前加~符号
    • 不允许有参数、不允许重载
    • 无返回类型
  • 调用析构函数:
    • 复合语句执行结束、函数执行结束、程序执行结束
    • 执行delete对象或者delete[]对象数组时释放new所动态分配的存储空间

十九、构造、析构函数调用顺序

#include <iostream>
using namespace std;class Demo {
public:Demo() { // 构造函数cout << "构造函数被调用" << endl;}~Demo() { // 析构函数cout << "析构函数被调用" << endl;}
};void createObject() {cout << "进入 createObject 函数" << endl;Demo obj; // 函数内部创建的对象cout << "即将退出 createObject 函数" << endl;
}int main() {cout << "进入 main 函数" << endl;Demo obj1; // 在 main 中创建的对象cout << "创建 obj1 完成" << endl;createObject(); // 调用函数,函数内创建临时对象cout << "退出 createObject 函数,回到 main" << endl;cout << "即将结束 main 函数" << endl;return 0;
}
进入 main 函数
构造函数被调用   // obj1 的构造函数
创建 obj1 完成
进入 createObject 函数
构造函数被调用   // createObject 函数中的 obj 的构造函数
即将退出 createObject 函数
析构函数被调用   // createObject 函数中 obj 的析构函数   
//这里是因为这个obj局部变量,看生存期函数结束 =>看 十五的表格!
//obj生存期到期要被释放所以这里析构函数被调用
退出 createObject 函数,回到 main
即将结束 main 函数
析构函数被调用   // main 中 obj1 的析构函数

二十、拷贝构造函数

类的特殊成员函数,用已定义的对象来初始化另一个被创建的对象

  • 特点:
    • 同为构造函数,与本类类名且不允许有返回类型
    • 第一个参数必须为本类对象的引用,若有其他参数必须均可缺省

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

Spring Boot中解决BeanDefinitionStoreException问题的实战分享

目录 前言1. 问题背景2. 问题分析2.1 异常分析2.2 常见的错误原因2.3 排查过程 3. 解决方案3.1 清理缓存和重建项目3.1.1 清理IDEA缓存3.1.2 使用Maven清理并重建项目 3.2 升级Maven版本3.2.1 下载最新Maven版本3.2.2 IDEA配置新的Maven版本3.2.3 清理缓存并重新构建 3.3 验证问…

Java避坑案例 - 线程池未复用引发的故障复盘及源码分析

文章目录 问题现象问题定位问题代码根因分析现象剖析newCachedThreadPool 源码SynchronousQueue特点构造方法主要方法应用场景Code Demo运行结果 问题修复 问题现象 时不时有报警提示线程数过多&#xff0c;超过2000 个&#xff0c;收到报警后查看监控发现&#xff0c;瞬时线程…

AHB Matrix 四星级 验证笔记(1.8-1.9)scoreboard的实现

文章目录 前言一、scoreboard接收数据的方式和比较行为的策略选择1.接受数据的方式1. 首先是数据从哪儿来&#xff1f; 2.比较数据的方式1.方案一2.方案二3. 方案的选择 二、scoreboard的实现1.代码 三、tip1.编辑断点2. return3.有关函数的返回值&#xff1a;函数内部隐式声明…

商业潜规则揭秘:从成交艺术到客户满意度的全方位策略

潜规则一&#xff1a;成交的艺术——七大核心原则 顾客追求的是超值感&#xff0c;而非单纯低价。 与顾客讨论的重点应是价值&#xff0c;而非价格。 客户没有绝对的对错&#xff0c;关键在于服务是否到位。 销售方式比销售产品本身更重要。 没有绝对最好的产品&#xff0c;只有…

在IDEA2024中生成SpringBoot模板

1、创建新项目 根据自己想要创建的工程类型选择&#xff0c;这里创建的时web工程 生成项目&#xff1a; 注意&#xff1a;SpringBoot只会扫描主程序所在的包及其下面的子包

物流行业信息化整体规划方案|117页PPT

文件是关于“物流行业信息化整体规划方案”的详细规划报告&#xff0c;涵盖了物流信息化咨询项目的规划报告&#xff0c;包括业务理解与需求分析、信息化现状分析、信息化蓝图规划以及实施路径与保障措施等多个方面。以下是对文档内容的总结&#xff1a; 1. 引言&#xff1a;信…

opencv优秀文章集合

文章目录 一、 CV领域1.1 图像处理1.2 目标检测与识别1.3 图像分割、目标追踪1.4 姿态估计1.5 3D视觉1.6 图像生成1.7 机器视觉1.8 其它 二、 nlp三、语音四、推荐系统 《OpenCV优秀文章集合》《OpenCV系列课程一&#xff1a;图像处理入门&#xff08;读写、拆分合并、变换、注…

Windows转Mac过渡指南

最近由于工作原因开始使用mac电脑&#xff0c;说实话刚拿到手的时候&#xff0c;window党表示真的用不惯。坚持用一下午之后&#xff0c;发现真的yyds&#xff0c;这篇文章说说mac电脑的基本入门指南。 1. 不会使用mac的触摸板&#xff0c;接上鼠标发现滚轮和windows是反的。 …

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…

安全成为大模型的核心;大模型安全的途径:大模型对齐

目录 安全成为大模型的核心 大模型安全的途径:大模型对齐 人类反馈强化学习(RLHF) 直接偏好优化(DPO) 安全成为大模型的核心 大模型安全的途径:大模型对齐 大模型对齐技术(Alignment Techniques for Large Language Models)是确保大规模语言模型(例如GPT-4)的输…

K8s企业应用之容器化迁移

#作者&#xff1a;曹付江 K8s企业应用之容器化迁移 Kubernetes&#xff08;K8s&#xff09;中的企业应用容器化迁移是一个复杂但重要的过程&#xff0c;平滑的迁移应用&#xff0c;可以让开发、运维、测试人员循序渐进的学习和掌握Kubernetes&#xff0c;通常包括以下步骤&am…

redis详细教程(3.hash和set类型)

hash Redis中的Hash是一种数据结构&#xff0c;用于存储键值对集合。在Redis中&#xff0c;Hash非常适合表示对象&#xff0c;其中对象的每个字段都对应一个键值对。以下是关于Redis中Hash的详细讲解&#xff1a; 特点&#xff1a; 1. 键值对集合&#xff1a;Hash是一个包含…

linux 安装php扩展:xlswriter

这里以xlswriter扩展为例 进入官方扩展&#xff1a;https://pecl.php.net查询自己php对应版本的扩展包 下载扩展 wget https://pecl.php.net/get/xlswriter-1.5.5.tgz 解压扩展 tar -zxvf xlswriter-1.5.5.tgz 进入扩展目录 cd xlswriter-1.5.5 查找对应php版本的phpiz…

SSID,即Service Set Identifier(服务设置的表示符号)

一、什么是SSID&#xff1f; SSID&#xff0c;即Service Set Identifier&#xff0c;是无线网络中的一个标识符&#xff0c;用于区分不同的无线网络。它可以理解为无线网络的名称&#xff0c;当我们在手机或电脑上搜索可用的无线网络时&#xff0c;就是通过SSID来识别和连接的…

LabVIEW过程控制实验平台

A3000实验平台通过LabVIEW开发&#xff0c;实现了过程控制的虚拟仿真与实时通信&#xff0c;显著提高了教学与实验的互动性和效率。该平台采用模块化设计&#xff0c;支持多种控制策略的实验教学&#xff0c;克服了传统实验设备的不足。项目背景 目前高校过程控制实验设备普遍…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言&#xff0c;涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等&#xff0c;能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能&#xff0c;并且免费开源&#xff0c;能够完美地…

Halcon 2D测量Metrology找线/圆/矩形/椭圆

通过2D测量&#xff0c;可以获取物体的范围、方向、角度、位置、尺寸和个数等特征。其中&#xff0c;Halcon的2D Metrology模块提供了亚像素级别的卡尺测量功能&#xff0c;可以测量的几何形状包括直线、圆、椭圆、矩形等。对于2D度量&#xff0c;必须提供要测量的对象的位置&a…

PostgreSQL的学习心得和知识总结(一百五十七)|新的 COPY 选项 LOG_VERBOSITY

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

分析 std::optional 的使用与常见错误

文章目录 引言常见错误及解决方案1. 错误使用 std::optional 变量进行算术运算2. 错误检查 std::optional 是否有值3. 忽视 std::optional 的默认值 结论 引言 std::optional 是 C17 引入的一个模板类&#xff0c;用于表示可能有也可能没有值的情况。它特别适用于函数返回值&a…