C++(学习)2024.9.18

news/2024/9/18 23:35:22 标签: c++, 学习, 开发语言, 引用, , 面向对象

目录

C++基础介绍

C++特点

面向对象的三大特征

面向对象与面向过程的区别

C++拓展的非面向对象的功能

引用

引用的性质

引用的参数

指针和引用的区别

赋值

键盘输入

string字符串

遍历方式

字符串与数字转换

函数

内联函数

函数重载overload

哑元函数

面向对象基础

与对象

概念

的内容


C++基础介绍

C++特点

在支持C语言的基础上,全面支持面向对象编程,编程领域广泛,功能强大,是为数不多的支持底层操作的面向对象编程语言,在面向对象的语言中执行效率极高。

面向对象的三大特征

封装        继承        多态

面向对象与面向过程的区别

        面向过程是以"怎么解决问题"为核心,这种思想关注的重点是“过程”,“过程”指的是一系列有序的步骤,只需要按照这个步骤来做,就能够得到预料的结果。这种思维方式偏向于计算机执行命令的本质,通常程序为一些有序的语句。这样的程序特点是执行效率高。适合小体量的软件项目工程,偏向性能的项目一般这样做。

        面向对象是以"谁来解决问题"为核心,关注的重点是“对象”。在计算机中,“对象”可以理解为一系列由于某种联系而聚焦在一起的数据。在编程的过程中处理对象之间的关系。这种方式更近于人的思考方式。这种编程方式的缺点就是执行效率底,编程效率高。适合大规模的软件项目。


C++拓展的非面向对象的功能

引用

引用从一定程度上讲是指针的平替。几乎被所有的面向对象编程语言所使用。引用相当于对某一目标变量起“别名”。操作引用与操作原变量完全相同。

#include <iostream>
using namespace std;
int main()
{
    int a = 1;
    int &b = a;    // b是a的引用
    cout << a << " " << &a << endl; 
    cout << b << " " << &b << endl;
    return 0;
}

引用的性质

1.可以改变引用的值,但是不能再次成为其他变量的引用

2.声明引用时,必须要初始化

3.声明引用时,基本写法不能初始化为null

4.声明引用的时候,初始化的值如果是纯数值,需要使用const关键字修饰引用,表示该引用为常量引用,这样引用的值不可改变。

5.可以将变量引用的地址赋值给一个指针,此时指针指向的还是原来的变量。
6.可以使用const修饰引用,此时如果原变量的值改变,引用的值也改变。

引用的参数

写一个函数,函数有两个参数a和b,函数的功能是交换两个传入的参数原来变量的值。

    
#include <iostream>
using namespace std;
void test2(int &a,int &b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}
int main()
{
    int a1 = 1;
    int b1 = 2;
    test2(a1,b1);
    cout << "a1=" << a1 << endl;
    cout << "b1=" << b1 << endl;
    return 0;
}

引用作为参数进行定义的时候,再参数传递时,是不会产生副本的,这样会提高运行效率,我们在正常的编程中,建议使用引用进行传递参数。引用形参,在不参数计算的情况下,我们建议使用const进行修饰。以达到引用的安全性。

指针和引用的区别

1.语法:
指针使用 * 来声明,例如 int* ptr。
引用使用 & 来声明,例如 int& ref。

2.初始化:
指针可以在任何时刻被重新赋值,可以指向不同的对象。
引用在初始化时必须绑定到一个对象,且不能更改为指向其他对象。

3.内存管理:
指针占用内存(存储地址),可以为 nullptr。
引用没有自己的内存地址,始终与某个对象关联。

4.解引用
指针需要使用 * 来解引用,例如 *ptr。
引用可以直接使用,无需解引用操作。

5.适用场景:
指针适用于需要动态内存管理或数组操作的场景。
引用更适合需要传递对象而不想复制时的场景。

赋值

通常编程中使用=进行赋值操作,C++新增了以下赋值语法。(只能用于初始化)

#include <iostream>
using namespace std;
int main()
{
    double b = 3.14;
    int b1 = b;
    int b2(b);
    int b3{b};  // 升级:对数据窄化做出警告
    cout << b << endl;  
    cout << b1 << endl; 
    cout << b2 << endl;
    cout << b3 << endl;
    return 0;
}

键盘输入

可以使用cin把用户在命令行中输入的内容赋值到变量中。cin与cout一样,都是属于头文件iostream中的标准输入输出流。

#include <iostream>
using namespace std;
int main()
{
    int b;
    cin>>b;
    getchar();
    string a;
    cout << "请输入一个字符串" << endl;
    getline(cin,a);
    cout << "您输入的内容是:" << endl;
    cout << a << endl;
    return 0;
}

string字符串

        string不是C++的基本数据型,而是C++标准库中的字符串,使用时需要引入对应的头文件#include<string>,string在绝大多数情况下可以替代C语言中的字符串,不必担心内存是否足够和字符串长度等等,其中内部还包含了很多字符串处理函数,可以完成各种情况下的字符串处理功能。string和C语言相同,字符串编码使用ASCII编码,不支持中文处理。

#include <iostream>
using namespace std;
int main()
{
    string str = "helloworld";
    cout << str.size() << endl;
    cout << str.length() << endl;
    cout << str[1] << endl;
    cout << str.at(5) << endl;
    return 0;
}

两种方式都可以,但是在C++中更推荐使用at函数,原因是at函数更安全。但是[ ]的方式效率更高。

遍历方式

#include <iostream>
using namespace std;
int main()
{
    string str = "helloworld";
    
    for(int i = 0; i < str.size(); i++)    //以for循环的方式进行输出字符串
    {
        cout << str.at(i);
    }
    cout << endl;
  
    for(char i:str)      //for each的方式进行循环遍历字符串
    {
        cout << i;
    }
    return 0;
}

字符串与数字转换

#include <iostream>
#include <sstream> // 字符串流
using namespace std;
int main()
{
    string s = "123";
//    int i = s; 错误

    // string → int
    istringstream iss(s);
    int i;
    iss >> i;
    cout << i << endl;

    // int → string
//    string s2 = i; 错误
    stringstream ss;
    ss << i;
    string s2 = ss.str();
    cout << s2 << endl;

    return 0;
}

函数

内联函数

内联函数用于取代C语言中宏定义的函数,内联函数的正确使用可以提升程序的执行效率。内联函数在编译的时候,直接把函数体展开到主函数中编译。在运行期间减少调用开销。
通常将具有以下性质的函数定义为内联函数:
●代码长度5行以内
●不包含复杂的控制语句
●频繁被调用
关键字:inline

后续学习的成员函数默认添加inline修饰。但是手动添加上的inline关键字,将函数声明是否为内联函数不是我们决定的,而是编译器有自己的判断准则,我们只是给编译器提一个建议。具体是否变为内联函数,还是编译器自己决定的。

函数重载overload

C++中允许多个函数使用同一个名称,这种用法就是函数重载。函数重载要求函数名称相同,但是参数不同(型不同或者数量不同,前后顺序不同),与返回值等其他因素无关。

#include <iostream>
using namespace std;
void print_show(int i)
{
    cout << "调用了int重载" << i << endl;
}
void print_show(string str)
{
    cout << "调用了string重载" << str << endl;
}
void print_show(float f)
{
    cout << "调用了float重载" << f << endl;
}
void print_show(double d)
{
    cout << "调用了double重载" << d << endl;
}
int main()
{
    print_show(11);
    return 0;
}

哑元函数

哑元函数的参数只有型,没有名称,这样的参数的函数哑元函数。

#include <iostream>
using namespace std;
void print_show(int ,int)
{
    cout << "调用了int哑元函数1" << endl;
}
void print_show(int i)
{
    cout << "调用了int哑元函数2" << endl;
}
int main()
{
    print_show(1,1);
    return 0;
}

作用1:哑元函数用来区分函数重载
作用2:运算符重载中用到。


面向对象基础

与对象

概念

是一个抽象的概念,用于描述同一对象的特点。
对象:根据的概念所创造的实体。

必须要先写才能创建对象。

的内容

中最基础的内容包括两个部分,一个是属性,一个是行为。
属性:表示一些特征项的数值,比如说:身高、体重、肤色、性别、重量、颜色、型号等等。而这些特征项的数值也被称为“成员变量”。属性一般以名词存在。
行为:表示能执行的动作,能干什么事?比如说:吃饭、睡觉、打架、打篮球。行为一般函数实现,也被称为“成员函数”。行为一般以动词存在。

成员 = 成员函数+成员变量。


http://www.niftyadmin.cn/n/5664708.html

相关文章

python中Web API 框架

Python 中有几个非常流行的 Web API 框架&#xff0c;它们让你可以轻松地构建和部署高效的 Web API。下面我将为你介绍几个最受欢迎的 Python Web API 框架&#xff0c;及其使用方法和特点。 1. FastAPI FastAPI 是一个现代、快速&#xff08;非常高性能&#xff09;的 Web 框…

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 3

利刃出鞘_Tomcat 核心原理解析&#xff08;十一&#xff09;-- Tomcat 附加功能 WebSocket – 3 一、Tomcat专题 - WebSocket - 案例 - OnMessage分析 1、WebSocket DEMO 案例 实现流程分析&#xff1a;OnMessage 分析 2、在项目 dzs168_chat_room 中&#xff0c;在 websocke…

2024年【四川省安全员A证】免费试题及四川省安全员A证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员A证】免费试题及四川省安全员A证试题及解析&#xff0c;包含四川省安全员A证免费试题答案和解析及四川省安全员A证试题及解析练习。安全生产模拟考试一点通结合国家四川省安全员A证考试最新大纲及…

在 Debian 12 上安装 Java 21

在 Debian 12 上安装 Java 21 可以通过以下两种主要方法&#xff1a; 使用 Oracle JDK 21 下载 deb 包&#xff1a; 从 Oracle 官方网站下载适用于 Linux 的 Java 21 的 deb 包(jdk-21_linux-x64_bin.deb)。如果是在命令行操作&#xff0c;可以使用 wget 命令来下载&#xff0c…

nginx进阶篇(二)

文章目录 概图一、 Nginx服务器基础配置实例二、Nginx服务操作的问题三、Nginx配置成系统服务四、Nginx命令配置到系统环境五、Nginx静态资源部署5.1 Nginx静态资源概述5.2 Nginx静态资源的配置指令5.2.1. listen指令5.2.2. server_name指令配置方式匹配执行顺序 5.2.3 locatio…

【文心智能体平台】如何开发一个恐怖故事小说生成器

开发灵感 我一直对恐怖故事有着浓厚的兴趣和热爱。从小我就沉迷于那些能让人毛骨悚然、心跳加速的恐怖情节&#xff0c;它们激发着我的想象力&#xff0c;让我沉浸在神秘而惊悚的世界中。 于是我创建了恐怖故事小说生成器&#xff0c;通过这个生成器&#xff0c;可以创造出无…

LINUX网络编程:传输层

目录 1.端口号 1.1知名端口号 1.2注意 2.UDP协议 2.1UDP报头的格式 2.2UDP的特点 2.3UDP的缓冲区 1.端口号 端口号的作用标识一个网络中主机的一个进程。 网络之间通信无非就是&#xff0c;发送端和接受端进程之间的通信&#xff0c;所以通过ip地址找到目标主机之后&am…

yolov5/8/9/10模型在车辆检测中的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在车辆检测中的应用【代码数据集python环境GUI系统】 1.背景意义 随着城市化进程的加速和机动车数量的激增&#xff0c;交通拥堵、交通事故等问题日益严重。传统的交通管理手段已经难以满足日益增长的交通需求。基于计算机视觉的车辆检测技术通过实时捕捉道路…