C++基础语法学习笔记

news2024/11/28 12:46:39

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 line
    cout << "hello world!" << endl;
    /* multiple
     line */
    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 block
    break;
  case y:
    // code block
    break;
  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 class
  public:             // Access specifier
    int 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.coloradmin.cn/o/1425465.html

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

相关文章

vue之elementUi的el-select同时获取value和label的两种方法

一、通过ref的形式&#xff08;推荐&#xff09; <template><div class"root"><el-selectref"optionRef"v-model"value"placeholder"请选择"style"width: 250px"><el-optionv-for"item in optio…

Kubernetes实战(二十三)-k8s event监控利器kube-eventer对接企微告警

1 背景 监控是保障系统稳定性的重要组成部分&#xff0c;在Kubernetes开源生态中&#xff0c;资源类的监控工具与组件监控比较多。 cAdvisor&#xff1a;kubelet内置的cAdvisor&#xff0c;监控容器资源&#xff0c;如容器cpu、内存&#xff1b;Kube-state-metrics&#xff1…

自动驾驶:Apollo如何塑造人类的未来出行

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言1. 什么是自定义指令&#xff1f;2. Apollo中的自定义指令2.1 查询中的自定…

JSON巨匠:FastJSON的序列化解析

Fastjson 简介 Fastjson 是一个 Java 库&#xff0c;可以将 Java 对象转换为 JSON 格式&#xff0c;当然它也可以将 JSON 字符串转换为 Java 对象。 Fastjson 可以操作任何 Java 对象&#xff0c;即使是一些预先存在的没有源码的对象。 Fastjson 源码地址&#xff1a;https://…

数据可视化 pycharts实现时间数据可视化

自用版 数据格式为&#xff1a; 运行效果为&#xff1a; from pyecharts import options as opts from pyecharts.charts import Polar, Page import csv filename "./hot-dog-places.csv" data_x [] data_y [] with open(filename) as f:reader csv.reade…

有向图查询所有环,非递归

图&#xff1a; 有向图查询所有环&#xff0c;非递归&#xff1a; import java.util.*;public class CycleTest {private final int V; // 顶点数private final List<List<Integer>> adjList; // 邻接表public CycleTest(int vertices) {this.V vertices;this.…

python基础——池

池的介绍&#xff1a; 提前创建进程池&#xff0c;防止创建的进程数量过多导致系统性能受到影响&#xff0c;在系统执行任务时&#xff0c;系统会使用池中已经创建进程/线程&#xff0c;从而防止资源的浪费&#xff0c;创建的进程/线程可以让多个进程使用&#xff0c;从而降低…

SW-LIMS实现化工企业危险化学品信息化管理

随着化工产业的不断发展,危险化学品的生产和使用在经济和社会发展中扮演着重要的角色。然而,危险化学品的安全隐患也同样日益突出,从危化品的生产到储存、运输和使用,如果控制不当,很容易造成安全事故,而一旦发生安全事故,不仅会造成巨大的经济损失,还将威胁到人类的生命健康与…

FFmpeg和Monibuka拉取rtsp(大华摄像头)视频流时未进行URLCode编码导致提示404等报错

场景 Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放&#xff1a; Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放_monibuca 搭建流媒体服务-CSDN博客 Nginx搭建RTMP服务器FFmpeg…

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…

Aloudata 近期荣誉盘点!接连斩获技术创新、案例实践、投资价值等权威认可

近期&#xff0c;Aloudata 凭借持续的技术积累、丰富的产品与解决方案以及多样场景下的最佳实践案例&#xff0c;在数据智能技术创新、案例实践、投资价值等领域全面开花&#xff0c;接连荣获&#xff1a; 2023 金猿榜「大数据产业年度最具投资价值」企业&#xff0c;并携手首…

APP开发者对接穿山甲广告联盟,有哪些特点?收益如何?

穿山甲平台作为巨量引擎旗下的第三方广告变现平台&#xff0c;在行业内始终处于领先地位&#xff0c;是不少开发者首选的对接平台。 通过穿山甲广告GroMore的Bidding竞价能力&#xff0c;不断提升自身的变现效率&#xff0c;新手可直接上手&#xff0c;避免繁琐调优流程&#…

PVE报错处理:kvm [2205]: vcpu0 ignored RDMSR: 0x1b8

PVE使用过程中如果遇到&#xff1a;kvm [2205]: vcpu0 ignored RDMSR: 0x1b8 报错信息处理方法 vim /etc/modprobe.d/kvm.conf "options kvm ignore_msrsY"&#xff0c;这里在msrsY后面加一个空格&#xff0c;然后粘贴report_ignored_msrsN&#xff0c;使其变成 op…

如何在微信搭建私域流量池?

A: ①给客户打标签 添加标签&#xff0c;多维度构建用户画像&#xff0c;精准发送消息。 ②群发信息 选择自定义时间&#xff0c;上传内容 (支持文字&#xff0c;图片) &#xff0c;一键群发 。 ③建立专属素材库 将常用的话术、图片与文件录入至素材库&#xff0c;员工可随…

微信小程序(基本操作)

概念&#xff1a; 小程序&#xff1a;就是小程序&#xff0c;mini program。现在市面上有微信小程序&#xff0c;百度智能小程序等等。 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了…

【算法】不懂数学原理也能看得懂的KMP算法

一.KMP算法的作用 举个例子&#xff0c;excel表格大家都用过吧&#xff0c;在表格内按下“CtrlF”可以弹出“查找和替换”功能&#xff0c;输入我们想要查找的关键字&#xff0c;系统就会帮我们定位到具体的位置&#xff0c;没有找到就上报具体的错误信息&#xff0c;KMP算法的…

解释性人工智能(XAI)

引言 解释性人工智能&#xff08;XAI&#xff09;是指一类旨在使人能够理解和解释机器学习模型的方法和技术。XAI的目标是提高AI系统的透明度和可理解性&#xff0c;让人们能够理解机器学习模型的决策过程、推理方式和结果。这对于社会应用和用户信任非常重要&#xff0c;因为A…

Axure 怎么用?一篇文章告诉你

Axure RP 9 该软件是一个非常实用的原型设计工具&#xff0c;了解 Axure、学会使用 Axure&#xff0c;作为产品经理&#xff0c;UI、界面规划等岗位的基本技能。特别是对于产品经理来说&#xff0c;画出优秀的原型可以更好地表达产品需求&#xff0c;提高沟通效率。如何快速入门…

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限&#xff0c;只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s &#xff0c;该字符串由用户输入。按键变更的定义是&#xff1a;使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次&#xff0c;而 s “bBBb”…

网络工程师学习笔记——HDLCPPP

继续学习计算机网络技术——HDLC&PPP 一、HDLC HDLC&#xff08; High-Level Data Link Control &#xff09;&#xff1a;高级数据链路控制 HDLC是一种面向比特的链路层协议。 HDLC的作用&#xff1a;接口地址借用&#xff0c;节省IP地址&#xff0c;使地址更加稳定 …