C++基础语法学习笔记

C++ Tutorial

1.基础语法

C++ 应用:操作系统、图形用户界面和嵌入式系统
C和C++区别:C++支持类和对象

C++语法

#include <iostream>
using namespace std;int main(){cout << "hello world!";return 0;
}int main () { cout << "Hello World! "; return 0; }

Line1:#include <iostream>是一个头文件库,可让我们使用输入和输出对象,例如 cout,头文件向 C++ 程序添加函数
Line2:using namespace std;意味着可以使用标准库中的对象和变量的名称
Line3:空行,C++中空行不影响
Line4:int main()总是会出现在C++程序中,称为function,大括号 {} 内的任何代码都将被执行
Line5:cout是与运算符 (<<) 一起使用来输出文本的对象。注意:每个C++语句都以分号;结束
Line6:return 0结束主函数

#include <iostream>int main(){std::cout << "hello world!";return 0;
}

using namespace std;也可以用std::代替

C++输出

cout对象,与运算符 (<<) 一起使用来输出文本或值
可以一次性输出多行,但是C++不会自动分行

#include <iostream>
using namespace std;int main(){cout << "hello world!";cout << "learning everyday";return 0;
}
hello world!learning everyday

如果要分行,有两种方式:

  • 插入转义序列\n:相当于回车
  • 使用 endl 操纵器
cout << "hello world!\n";
cout << "hello world!" << endl;
hello world!
learning everyday

C++注释

单行注释://
多行注释:/**/

#include <iostream>
using namespace std;int main(){// single linecout << "hello world!" << endl;/* multipleline */cout << "learning everyday";return 0;
}

C++变量

  • int:整型
  • double:浮点型
  • char:字符
  • string:字符串
  • bool:布尔

创建变量

type variableName = value;int x = 5;
int y = 7;
int myAge = x + y;
string text = " years";
cout << "I am " << myAge << text << " old";

可以一行创建多个变量

int x = 5, y = 4, z = 6;

可以一行赋值多个变量相同的值

int x, y, z;
x = y = z = 5;

固定变量的值使用const

const int x = 5;

C++输入

cin与运算符>>一起用来读取输入

cin >> x;

C++数据类型

在这里插入图片描述
floatdouble的区别:float小数点后面最多6-7个数字,而double可以有15个数字,使用double计算更安全
浮点数可以用科学计数法,使用e表示

float f1 = 35e3;

bool类型只能赋值falsetrue

bool learning = true;

单一字符可以用ASCII码表示

char a = 65;
cout << a;
A

创建string时头文件要导入#include <string>

C++运算符

算术运算符
在这里插入图片描述
分配运算符
在这里插入图片描述
比较运算符
在这里插入图片描述
逻辑运算符
在这里插入图片描述

C++ 字符串

  • 字符串连接:+或者append()
string firstName = "Zoey ";
string lastName = "Doe";
string fullName = firstName.append(lastName);
string fullName = firstName + " " + lastName;
  • 字符串长度:length()或者size()
string text = "learning everyday";
cout << text.length();
17
  • 字符串读取:[]
string text = "learning";
cout << text[2];
a
  • 特殊字符串:字符串有双引号,因此文本中有一些特殊字符无法识别,需要专义字符

在这里插入图片描述

string text = "living like a \"tree\"";
cout << text;
living like a "tree"
  • 输入字符串

cin输入字符串文本时默认以空格为结束符,因此只会读取第一个单词

string text;
cin >> text;
cout << text;
living like a tree
living

如果要读取一行,使用getline()

string text;
getline(cin, text);
cout << text;
living like a tree
living like a tree

C++数学

头文件#include "cmath",常见maxminabs

C++条件语句

  • if else语句
int main(){int time = 22;if (time < 10){cout << "morning";}else if (time < 20){cout << "day";}else{cout << "evening";}
}

用一句话描述if else语句

variable = (condition) ? expressionTrue : expressionFalse;
result = (time < 18) ? "Good day" : "Good evening";
  • switch语句

expressionx的值比较,如果匹配就执行后面的代码,如果所有情况都不匹配,就执行default

switch(expression) {case x:// code blockbreak;case y:// code blockbreak;default:// code block
}
int main(){int day = 2;switch (day) {case 1:cout << "Monday";break;case 2:cout << "Tuesday";break;default:cout << "Weekend";break;}
}
  • while循环

包括whiledo while

while (condition) {// code
}
do {// code
}
while (condition);
int main(){int index = 0;do{cout << index;index++;}while (index < 4);
}
  • for循环
for (statement 1; statement 2; statement 3) {// code
}- statement 1:初始值- statement 2:执行条件- statement 3:执行语句
  • breakcontinue

break结束当前循环,continue结束当前轮次

int main(){for (int index=0; index < 10; index++){if (index % 2 == 0){continue;}cout << index;}
}

C++数组

  • 数组初始化:指定类型,数组名,[]为数组长度,可以不指定,赋值用{},可以后面再赋值
string cars[4] = {"Volvo", "BMW", "Ford", "Mazda"};
  • 数组循环:使用for循环

C++中还有一个for-each循环,可以更方便的遍历数组

string cars[5] = {"Volvo", "BMW", "Ford", "Mazda", "Tesla"};
for (int i = 0; i < 5; i++) {cout << i << " = " << cars[i] << "\n";
}string numbers[4] = {"a", "b", "c", "d"};for (string i: numbers){cout << i << endl;}
  • 数组长度

sizeof()输出数组字节长度,因此是4*4=16,要得到长度还需要除int型的字节数

int numbers[4] = {20, 30, 40, 50};
cout << sizeof(numbers) / sizeof(int);
  • 多维数组
string letters[2][4] = {{ "A", "B", "C", "D" },{ "E", "F", "G", "H" }
};

C++结构体

将多个相关的变量放在一起组成结构体

struct StructureName{   // 声明结构体,结构体命名可以省略int myNum;         // 结构体成员string myString;   // 结构体成员
}myStruct1, myStruct2, myStruct3;       // 结构体变量

创建结构体变量可以通过结构体命名,也可以直接在后面创建

int main(){struct car{string brand;int price;}myCar1;car myCar2;myCar2.brand = "Ford";myCar1.price = 1000;cout << myCar1.price << endl;
}
1000

C++指针

  • 引用变量reference variable:用来指向某个变量,创建时使用&运算符
int main(){string food = "Pizza";string &meal = food;cout << food << endl;cout << meal << endl;meal = "Coco";cout << food << endl;
}output:
Pizza
Pizza
Coco

创建引用变量meal是使用&meal,代表引用于food变量,因此输出是相同的。如果修改了meal的值,food的值也会变化

&运算符也可以用来获取变量物理地址

int main(){string food = "Pizza";cout << &food << endl;
}output:
0x16fdff118
  • 指针变量pointer variable:将物理地址存储为值,使用*运算符
int main(){string food = "Pizza";string* ptr = &food;cout << food << endl;cout << &food << endl;cout << ptr << endl;cout << *ptr << endl;
}output:
Pizza
0x16fdff118
0x16fdff118
Pizza

ptr指针变量存储food的物理地址,此处的&是取址符,food物理地址是0x16fdff118,因此&food和ptr都是0x16fdff118,*ptr是用来dereference,输出ptr指针指向的变量取值,也就是food的值。*运算符有两个作用

  • 声明一个指针变量
  • dereference操作符

如果修改了指针变量的值,原始变量的值也会变化

*ptr = "Hamburger";
cout << *ptr << endl;
cout << food << endl;output:
Hamburger
Hamburger

2.函数

创建函数

void myFunction() { // 声明// code to be executed (定义)
}- void:函数返回类型- myFunction():函数名

自定义函数创建时可以只声明不定义,但是声明一定要在main函数前

void myFunction();int main(){myFunction();
}void myFunction(){cout << "hello";
}

函数参数

函数传入参数时要定义类型,可以一次性传入多个参数,可以设置默认值,也可以传入数组

#include "iostream"
using namespace std;void myFunction(string name, int age, int cars[3]){cout << name << " is " << age << " years old" << endl;for (int i = 0; i < 3; i++){cout << cars[i] << endl;}
}int main(){int age = 10;int cars[3] = {20, 30, 40};string name = "zoey";myFunction(name, age, cars);return 0;
}
zoey is 10 years old
20
30
40

函数参数也可以传入引用变量,需要修改变量值时比较有用,下面例子用来交换firstsecond的值,swap函数传入的是引用变量,first=&x,因此x的值变成y之后,first的值也变成了sceond,如果传入的不是&x而是x,函数内部的变化是不会影响到参数的。

void swap(int &x, int &y){int z = x;x = y;y = z;
}int main(){int first = 2;int second  = 3;swap(first, second);cout << first << endl;cout << second << endl;
}
  • 函数重载:只要参数的数量和/或类型不同,多个函数就可以具有相同的名称
int plusFunc(int x, int y) {return x + y;
}double plusFunc(double x, double y) {return x + y;
}
  • 函数回溯:递归,函数中再调用自身
int sum(int k) {if (k > 0) {return k + sum(k - 1);} else {return 0;}
}int main() {int result = sum(10);cout << result;return 0;
}

3.面向对象编程

创建类和对象

类class是自定义的一种数据类型,比如汽车,对象object是类的某个实例,比如丰田,每个类都有属性attributes和方法methods

class MyClass {       // The classpublic:             // Access specifierint myNum;        // Attribute (int variable)string myString;  // Attribute (string variable)
};- class用来创建一个类,命名为MyClass- public是一个访问说明符access specifier,它指定可以从类外部访问该类的成员(属性和方法)- 类属性有两个:整型变量myNum和字符变量myString

创建对象直接使用类名,然后通过.引用属性为其赋值

class MyClass{
public:int age;string name;
};int main(){MyClass obj;obj.age = 12;obj.name = "zoey";cout << obj.name << endl;
}output:
zoey

类方法

方法就是属于这个类的函数,有两种定义方式

  • 类内部定义
class MyClass{
public:void myMethod(){cout << "hello";}
};
  • 类外部定义:使用::操作符
class MyClass{
public:void myMethod();
};void MyClass::myMethod(){cout << "hello";
}

构造函数Constructor

C++中的构造函数是一种特殊的方法,在创建类的对象时会自动调用它。创建构造函数,要使用与类相同的名称,后跟括号 ()。构造函数主要作用是在对象创建时执行必要的初始化操作。构造函数中传入参数可以用来为属性赋初始值。

class Car{
public:string brand;  //属性int year;  //属性Car(string x, int y){  // 构造函数声明brand = x;year = y;}
};int main(){Car obj("Ford", 20);  //创建对象时可以直接传入参数cout << obj.brand << endl;cout << obj.year << endl;
}

构造函数也可以在类外部定义,和方法定义一样

class Car{
public:string brand;int year;Car(string x, int y);
};Car::Car(string x, int y){brand = x;year = y;
}

访问说明符Access Specifiers

C++中有三种访问说明符:

  • public:可以从类外部访问成员,能赋值或者修改值
  • private:无法从类外部访问(或查看)成员
  • protected:不能从类外部访问成员,但是可以在继承类中访问它们
class Car{
public:int year;
private:int age;
};int main(){Car obj;obj.year = 12;obj.age = 20;
}output:
'age' is a private member of 'Car'

默认情况下,如果不指定访问说明符,类的所有成员都是私有的

封装Encapsulation

封装是为了确保“敏感”数据对用户隐藏。 为此须将类变量/属性声明为私有(无法从类外部访问)。 如果希望其他人读取或修改私有成员的值,可以提供公共的 getset 方法

#include "iostream"
using namespace std;class Employee{
private:int salary;  // 私有属性
public:void setSalary(int s){salary = s;}int getSalary(){return salary;};
};int main(){Employee obj;obj.setSalary(2000);cout << obj.getSalary() << endl;
}output:
2000

salary是私有属性,但是可以通过公有方法setSalarygetSalary设置和获取salary的值。这种方式能更好的控制代码,只需要修改一部分,增加数据的安全性。

继承Inheritance

C++中可以将属性和方法从一个类继承到另一个类,继承有两个概念:

  • 派生类:从另一个类继承的类
  • 基类:继承自的类

从一个类继承需要使用:符号

  • 继承可以多层
class Myclass{  //基类
public:void fucntion(){cout << "day" << endl;}
};class Mychild: public Myclass{ //继承类
};class MyGrandchild: public Mychild{  //继承类
};int main(){MyGrandchild obj;obj.fucntion();
}
  • 可以继承自多个类
class Class1{
public:void fucntion1(){cout << "day" << endl;}
};class Class2{
public:void function2(){cout << "hello" << endl;}
};class ClassChild: public Class1, public Class2{
};int main(){ClassChild obj;obj.fucntion1();obj.function2();
}
  • 访问说明符proteced:继承类可以访问
class Employee{
protected:int salary;
};class Programmer: public Employee{
public:int bonus;int get(){return salary;}void set(int s){salary = s;}
};int main(){Programmer obj;obj.set(1000);obj.bonus = 1200;cout << obj.get() << endl;
}

多态Polymorphism

多态意味着“多种形式”,当我们有许多通过继承相互关联的类时,就会发生这种情况。例如,考虑一个名为 Animal 的基类,它有一个名为 AnimalSound() 的方法。 动物的派生类可以是猪、猫等,而且它们也有自己的动物声音方法

#include "iostream"
using namespace std;class Animal{
public:void animalSound(){cout << "the animal make a sound \n";}
};class Pig: public Animal{
public:void animalSound(){cout << "the pig says:wee" << endl;}
};class Dog: public Animal{
public:void animalSound(){cout << "the dog says:wow " << endl;}
};int main(){Animal a;Pig b;Dog c;a.animalSound();b.animalSound();c.animalSound();
}
the animal make a sound 
the pig says:wee
the dog says:wow 

C++文件

#include <fstream>

fstream库用于处理文件,有三个类

  • ofstream:创建和写文件
  • ifstream:读取文件
  • fstream:创建,写,读取文件
#include <iostream>
#include <fstream>
using namespace std;int main() {//创建空白文件ofstream MyFile("filename.txt");// 写文件MyFile << "Files can be tricky, but it is fun enough!";// 关闭文件MyFile.close();
}

异常处理

C++ 中的异常处理由三个关键字组成:trythrowcatch

try {// 尝试的代码块throw exception; // 错误发生时显示异常
}
catch () {// 处理错误的代码块
}
int main(){try{int age = 15;if (age > 18){cout << "Access granted" << endl;}else{throw (age);}}catch (int number){cout << "Access denied" << endl;cout << "you are " << number << endl;}
}
Access denied
you are 15

由于age<18,因此报错,错误类型定义为age,输入到catch作为参数传入,如果不知道错误类型,可以直接使用catch (...)

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

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

相关文章

8-Docker网络模式之container

1.介绍 Docker container网络模式是指指定新创建的Docker容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 使用Docker container网络模式新建的容器不会创建的自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口等。然而两个容器除了网络…

知识图谱推理方法综述

目录 前言1 基于符号表示的推理方法1.1 Axioms和Datalog1.2 图结构和规则学习1.3 TBox和ABox 2 基于向量表示的推理方法2.1 嵌入系列和Ontology Embedding2.2 向量的规则学习2.3 图神经网络 3 符号逻辑和表示学习的融合3.1 向量表示学习与本体规则学习3.2 规则演绎推理3.3 符号…

Oracle闪回日志管理(flashbackup log)

Oracle闪回日志管理&#xff08;flashbackup log&#xff09; 1.开启闪回日志 shutdown immediate startup mount; alter database archivelog; alter database flashback on; alter database open; 2、查看闪回日志保留期限 show parameter flash 默认是1440分钟&#xff0c…

软件工程知识梳理4-详细设计

详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统&#xff0c;也就是说.经过这个阶段的设计工作.应该得出对目标系统的精确描述.从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。 详细设计的的目标不仅仅是逻辑上正确地实现每个模块地功能&a…

手机屏幕生产厂污废水处理需要哪些工艺设备

随着手机行业的快速发展&#xff0c;手机屏幕生产厂的规模也越来越大&#xff0c;但同时也带来了大量的污废水排放问题。为了保护环境和人类的健康&#xff0c;手机屏幕生产厂需要采取适当的工艺设备来处理污废水。本文将介绍手机屏幕生产厂污废水处理所需的工艺设备。 首先&am…

计算机速成课Crash Course - 27. 3D 图形

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 27. 3D 图形 (qq.com) 27. 3D 图形 在过去五集&#xff0c;我们从基于…

Wireshark网络协议分析 - Wireshark速览

在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获&#xff08;Capture&#xff09;2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…

npm i 遇到了 npm ERR! code CERT_HAS_EXPIRED

npm i 遇到了 npm ERR! code CERT_HAS_EXPIRED 更新你的系统时间【命令 date】。确保你的计算机上的时间和时区设置正确&#xff0c;并且与当前时间相符。 清除你的 npm 缓存。使用 npm cache clean --force 命令清除你的 npm 缓存&#xff0c;关闭ssl验证&#xff0c;并重新运…

Python+Selenium+Unittest 之selenium15--等待时间

在正常的自动化过程中&#xff0c;如果整篇代码中没有加等待时间的话&#xff0c;有时候可能页面跳转或者还没开始点击就执行到下一个流程了&#xff0c;这时候因为页面没有加载完毕&#xff0c;所以有可能会导致找不到对应的元素而报错&#xff0c;因此我们需要在整个代码流程…

AlmaLinux上安装Docker

AlmaLinux上安装Docker 文章目录 AlmaLinux上安装Docker一、前言二、具体步骤1、Docker 下载更新系统包索引&#xff1a;添加Docker仓库&#xff1a;安装Docker引擎&#xff1a; 2、Docker服务启动启动Docker服务&#xff1a;设置Docker开机自启&#xff1a; 3、Docker 安装验证…

Android开发--ProgressBar应用显示测点数量

1.自定义ProgressBarView public class ProgressBarView extends View {private Paint mPaintBack;private Paint mPaint;private Paint mPaintText;private float process;int strokeWidth 3;//圈宽度int textSize 17;//字大小private long duration 1000;private float st…

一站式在线APP封装平台的革新之旅

随着移动互联网的快速发展&#xff0c;App已经成为我们日常生活中不可或缺的一部分。对于开发者而言&#xff0c;将创新的应用快速打包成APK格式&#xff0c;并进行有效分发&#xff0c;是确保应用生命周期成功的关键一步。传统的App打包过程往往需要复杂的环境配置、依赖管理以…

Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导

文章目录 1. 背景基础知识1.1 什么是状态空间模型&#xff08;State Space Model&#xff0c;SSM&#xff09;&#xff1f;1.2 什么是离散化&#xff08;Discretization&#xff09;&#xff1f;1.3 为什么需要离散化&#xff1f; 2. SSM离散化过程推导2.1 为什么在离散化过程中…

无人机除冰保障电网稳定运行

无人机除冰保障电网稳定运行 近日&#xff0c;受低温雨雪冰冻天气影响&#xff0c;福鼎市多条输配电线路出现不同程度覆冰。 为保障福鼎电网安全可靠运行&#xff0c;供电所员工运用无人机飞行技术&#xff0c;通过在无人机下方悬挂器具&#xff0c;将无人机飞到10千伏青坑线…

电脑和手机连接酒店的wifi,网络不通导致charles无法抓手机的包

查看苹果手机&#xff0c;连wifi后的ip地址 电脑去ping 手机的ip地址&#xff0c;发现ping不通 解决方案&#xff1a; 应该是酒店wifi的问题&#xff0c;让朋友开个手机热点&#xff0c;电脑和我的手机都连这个热点&#xff0c;就可以抓包了

2024.1.31每日一题

LeetCode 找出不同元素数目差数组 2670. 找出不同元素数目差数组 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 di…

OG Trade在ZKX揭幕:一家基于Starknet的游戏化永续合约交易所

ZKX的 OG Trade通过内置游戏化和30分钟交易竞赛&#xff0c;为所有交易者创造机会&#xff0c;革新了永续合约交易模式。 2024年1月30日 — ZKX宣布推出OG Trade&#xff0c;这是一家基于Starknet的游戏化永续合约交易所&#xff0c;旨在满足短期交易者、高水平交易者和波段交易…

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【Go-Zero】Windows11下etcd的安装与初步使用 大家好 我是寸铁&#x1f44a; 总结了一篇Windows11下etcd的安装与初步使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言&#xff1a; 在使用etcd 前&#xff0c;我们需要了解一下etcd 是什么&#xff0c;为什么使用etcd…

日本大带宽服务器速度和性能评测的关系

在互联网的快速发展中&#xff0c;大带宽服务器在提供高速、稳定的数据传输方面起着至关重要的作用。特别是在日本&#xff0c;由于其先进的网络基础设施和庞大的互联网用户群体&#xff0c;大带宽服务器的需求日益增长。那么&#xff0c;日本大带宽服务器的速度和性能评测有何…