从0开始C++(一)

目录

c++的基本介绍

C语言和C++ 的区别

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

引用

引用使用的注意事项

赋值

终端输入

cin

getline

string字符串类

遍历方式

字符串和数字转换

函数

内联函数

函数重载overload

小练习:

参考代码


c++的基本介绍

C++是一种通用的高级编程语言,它是从C语言发展而来的。C++在C语言的基础上增加了许多新的特性和功能,使得它成为一种更强大、更灵活的编程语言。

C++具有面向对象的编程能力,可以使用类和对象来组织和管理代码。它支持封装、继承和多态等面向对象编程的特性,可以更好地组织和管理大型项目的代码。

C++也可以进行底层系统编程,它提供了许多与硬件交互和操作系统相关的功能,例如内存管理、指针操作和文件读写等。

C++是一种编译型语言,它将源代码编译成机器码,然后可以在各种不同的平台上运行。C++的编译器非常普及,几乎可以在任何操作系统上找到,包括Windows、Linux、Mac等。

C++具有高性能和效率,它可以直接访问内存和硬件资源,不需要依赖其他高级语言的运行时环境。这使得C++成为一种特别适合开发性能敏感的应用程序,如游戏引擎、图形界面和嵌入式系统等。

总的来说,C++是一种功能强大、灵活且高效的编程语言,适用于各种不同的应用场景和项目规模。

C语言和C++ 的区别

  1. 面向对象:C++引入了面向对象编程的概念,允许使用类、对象、继承、多态等特性进行程序设计,而C语言则没有这些特性。

  2. 类型检查:C++具有更严格的类型检查机制,可以在编译阶段捕获更多的类型错误,提高了程序的安全性和可靠性。而C语言对类型检查的支持较弱。

  3. 标准库:C++标准库提供了更多的功能和组件,如容器、算法、文件操作等,使得开发更加方便,而C语言的标准库相对较小。

  4. 异常处理:C++支持异常处理的机制,可以捕获和处理程序运行时的异常情况,而C语言没有这个特性。

  5. 扩展性:C++允许通过编写类的扩展来实现新的功能,而C语言则需要通过编写新的函数来实现。

  6. 兼容性:C++是C语言的超集,几乎所有的C语言代码都可以在C++中编译和运行,但C++还引入了一些新的特性和语法,可能导致部分C语言代码无法在C++中编译。

总的来说,C++在C语言的基础上引入了面向对象编程的特性,并提供了更多的功能和安全性,适用于更复杂的程序开发。而C语言更加简洁和灵活,适用于一些对性能要求较高、对功能要求较简单的场景。

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

【思考】如果把大象装进冰箱,应该怎么做?

1、  (我)打开冰箱

2、  (我)把大象放进去

3、  (我)把冰箱关上

 上面的这种方式就是典型的面向过程编程思想,这种思想关注的重点是“过程”,过程指的是一系列有序的步骤,只需要按照这个步骤来做,就可以得到预想的结果。这种思维方式偏向于计算机执行命令的本质。这种程序的特点是执行效率高(因为都是亲历亲为)。适合小体量软件项目编程,偏向性能的项目一般这样做。

使用面向对象的思想把大象装进冰箱。

1、  (我)把大象和冰箱拟人化。

2、  (我)给大象和冰箱安排任务。

3、  (自动)大象和冰箱执行任务。

面向对象的语言,关注的重点是“对象 ”。在计算机中对象可以理解为一些列由于某种联系聚焦在一起的数据,在编程的过程中处理对象之间的关系。这种思考方式更近于人类的方式。这样的程序缺点在于执行效率底,但是编程效率高,适合大规模的软件项目。

总的来讲,面向过程是以“怎么解决问题”为核心,面向对象是以“谁来解决问题”为核心。

引用

引用从一定程度上讲是c语言中指针的平替,几乎被所有的面向对象编程语言所使用。引用相当于对某一目标变量起一个”别名“, 操作引用与操作原变量完全一样。(ps:你要抓鲁迅确实关周树人的事)
#include <iostream>

using namespace std;

int main()
{
    int a = 1;
    int &b = a; // b是a的引用

    b++;
    cout << a << " " << &a << endl; // 2 0x61fe88
    cout << b << " " << &b << endl; // 2 0x61fe88

    return 0;
}

引用使用的注意事项

1、可以改变引用的值,但是不能成为其他变量的引用。

实例:

#include <iostream>

using namespace std;

int main()
{
    int a = 1;
    int &b = a; // b是a的引用
    int c = 3;
    b = c;  // 赋值,不是引用,b还是a的引用

    b++;
    cout << a << " " << &a << endl; // 4 0x61fe88
    cout << b << " " << &b << endl; // 4 0x61fe88
    cout << c << " " << &c << endl; // 3 0x61fe84

    return 0;
}

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

实例:

#include <iostream>

using namespace std;

int main()
{
    int a = 1;
//    int &b; // 错误引用,必须初始化

    return 0;
}

3、引用不能初始化为空

实例:

#include <iostream>

using namespace std;

int main()
{
    int a = 1;
//    int &b = NULL;    // 错误引用不能初始化null
//    int &c = nullptr;   // 错误引用不能初始化nullptr

    return 0;
}

4、声明引用的时候,初始化的值可以为纯数值,但是必须用 const 来修饰引用,表示引用为常量引用。

实例:

#include <iostream>

using namespace std;

int main()
{
    const int &b = 12;  // 常量引用
//    b = 444; // 错误 常量引用的值无法被改变
    cout << b << " " << &b << endl;

    return 0;
}

5、可以将引用的地址赋值给一个指针,此时指针指向的还是原来的变量。

实例:

#include <iostream>

using namespace std;

int main()
{
    int a = 1;
    int &b = a;
    int *c = &b;    // c同时指向了A和B


    cout << a << " " << &a << endl; // 1 0x61fe84
    cout << b << " " << &b << endl; // 1 0x61fe84
    cout << *c << " " << c << endl; // 1 0x61fe84
    return 0;
}

6、可以使用const修饰引用,此时,无法直接通过引用改变原来的值,但是如果原来变量的值改变,引用的值也跟着改变。

实例:

#include <iostream>

using namespace std;

int main()
{
    int a = 2;
    const int &b = a;
//    b++; // 错误 b是只读的
    a++;

    cout << a << " " << &a << endl; // 1 0x61fe84
    cout << b << " " << &b << endl; // 1 0x61fe84
    return 0;
}

7、引用作为参数进行定义的时候,在参数传参时,是不会产生副本的,这样可以提高程序的运行效率在我们正常编程中,建议使用引用作为传递参数。引用参数不需要参与计算时,建议使用const进行修饰,避免误修改,提高引用的安全性。

实例:

#include <iostream>

using namespace std;

// 函数的功能是交换两个传入的参数原来变量的值。
void test(int &a,int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}
// 输出。
void test2(const int &a,const int &b)
{
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}

int main()
{
    int a1 = 1;
    int b1 = 2;

    test(a1,b1);
    test2(a1,b1);

    return 0;
}

赋值

通常编程中使用=进行赋值,C++新增了以下赋值语法。

#include <iostream>

using namespace std;

int main()
{
    int a(1);   // int a = 1;
    cout << a << endl;

    int b(a);   // int b = a;
    cout << b << endl;

    int c(a+b); // int c = a + b;
    cout << c << endl;

    double d = 3.14;
    int d2(d);
    cout << d2 << endl; // 输出为3,浮点型转int型时会进行数据窄化处理,舍弃小数点后的数值(不会报错和警告)

    int d3{d};  // C++11对此进行了升级:对数据窄化会做出警告(只是有个警告,其他没有任何改变)
    
    cout << d3 << endl; // 3


    return 0;
}

终端输入

cin

 可以使用cin吧用户在命令行中输入的内容赋值到变量中, cin cout 一样都属于 iostream 中的标准输入输出流。(遇到空格就会结束)

实例:

#include <iostream>

using namespace std;

int main()
{
    int a;
    // C++的字符串string
    string str;

    cout << "请输入一个数字和字符串" << endl;
    cin >> a >> str;    // 接收键盘输入,一个整数和一个字符串。可以连续操作

    cout << a << " " << str << endl;
    return 0;
}

getline

如果cin输入的字符串需要包含空格可以使用 getline(cin,str) 的方式

#include <iostream>

using namespace std;

int main()
{
    // C++的字符串string
    string str;

    cout << "请输入一个字符串,可以包含空格,输入完成后点击回车" << endl;
    getline(cin,str);

    cout << str << 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; // 10
    cout << str.length() << endl; // 10

    cout << str.at(1) << endl;  // e
    return 0;
}

遍历方式

string支持多种遍历方式

1、普通遍历(以for循环为主)

#include <iostream>

using namespace std;

int main()
{
    string str = "helloworld";

    // 以for循环的方式遍历输出字符串
    for(int i = 0;i < str.size();i++)
    {
        cout << str.at(i);
    }
    cout << endl;

    return 0;
}

2、for each遍历方法

#include <iostream>

using namespace std;

int main()
{
    string str = "helloworld";

    // 以 for each的方式进行循环遍历字符串
    for(char i:str)
    {
        cout << i;
    }

    return 0;
}

字符串和数字转换

istringstream:字符串转int类型

stringstream:int类型转字符串

#include <iostream>
#include <sstream>  // 字符串流

using namespace std;

int main()
{
    string s = "123";
//    int i = s; // 错误
    int i = 0;
    // string → int
    istringstream iss(s);
    iss >> i;
    cout << i << endl;

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

函数

内联函数

内联函数用于取代C语言中宏定义的函数,使用inline修饰,将函数声明为内联函数。内联函数的正确使用可以提升程序的执行效率。内联函数在编译的时候,直接把函数体展开到主函数中编译,在运行时可以减少调用的开销。

虽然我们使用inline将函数进行了声明,但是函数执行时到底是不是内联函数,这个不是我们能决定的。编译器有自己的判断准则,我们只是给编译器提一个建议,具体是否变为内联函数,还是编译器自己决定的。

通常将具有以下性质的函数写为内联函数。

● 代码长度很短(5行以内)

● 不包含复杂的控制语句

● 频繁被调用

#include <iostream>

using namespace std;
// 内联函数
inline void pint_string(string str)
{
    cout << str << endl;
}

int main()
{
    pint_string("helloworld");
    return 0;
}

函数重载overload

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

#include <iostream>

using namespace std;

void print_show(int i)
{
    cout << "调用了int重载" << i << endl;
}

// 错误名称一样,参数一样编译器无法区分
//void print_show(int d)
//{
//    cout << "调用了int2重载" << d << endl;
//}

void print_show(string str)
{
    cout << "调用了string重载" << str << endl;
}

// 错误与返回值类型无关
//string print_show(string str)
//{
//    cout << "调用了string重载" << str << endl;
//    return str;
//}

void print_show(double d)
{
    cout << "调用了double重载" << d << endl;
}

int main()
{
    print_show(1.2);
    return 0;
}

哑元函数

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

作用1:哑元函数用来区分函数重载

作用2:运算符重载中用到

作用3:历史遗留,向上兼容。

#include <iostream>

using namespace std;

// 哑元函数
void print_show(int t)
{
    cout << "调用了int哑元函数" << t << endl;
}

void print_show(int i)
{
    cout << "调用了int函数" << i << endl;
}

int main()
{
    print_show(1,2);
    return 0;
}

小练习:

1、键盘输入一个100-999之间的数,依次输出这个数的个十百位。

2、输入一行字符串,分别统计出其中的英文字母,数字和其他字符的个数。

参考代码

#include <iostream>

using namespace std;

void practice1()
{
    int a;
    while(1)
    {
        cout << "请输入一个100-999之间的数:";
        cin >> a;
        if(a<100 || a>999)
        {
            cout << "错误:请输入100-999!" << endl;
            continue;
        }
        cout << "百位:" << a/100 << "  十位:" << (a/10)-(a/100)*10 <<"  个位:" << a-(a/10)*10 << endl;
    }

}


void practice2()
{
    string str;
    int n=0;
    int c=0;
    int t=0;
    while(1)
    {
        cout << "请输入一个字符串:";
        getline(cin,str);

        for( char i:str)
        {
            if(('a' <= i && i <= 'z')||('A' <= i && i <= 'Z'))
            {
                ++c;
            }
            else if('0' <= i && i <= '9')
            {
                ++n;
            }
            else
            {
                ++t;
            }
        }
        cout << "数字个数:" << n <<endl;
        cout << "字母个数:" << c <<endl;
        cout << "其他字符个数:" << t <<endl;
    }

}

int main()
{

//    practice1();

    practice2();

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2+Element-ui后台系统常用js方法

el-dialog弹框关闭清空form表单并清空验证 cancelDialog(diaLog, formRef) {this[diaLog] falseif (formRef) {this.$refs[formRef].resetFields()} }页面使用&#xff1a; <el-dialog :visible.sync"addSubsidyDialog.dialog" close"cancelDialog(addSub…

服务器部署开源大模型完整教程 Ollama+Gemma+open-webui

现在开源的大模型其实挺多的&#xff0c;今天搭建Gemma这个谷歌开源的大模型&#xff0c;但是你想搭建别的只要你看完你都会了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://ollama.com/ github&#xff1a;https://github.c…

酷开会员 | 酷开系统将艺术、回忆与浪漫融入生活

随着审美观念的改变以及技术的提升&#xff0c;消费者对家用电视的需求已不局限于单纯的功能性&#xff0c;外观设计带来的美感与视觉效果也愈发成为消费者关注的焦点。在画质和功能逐步完善的当下&#xff0c;电视中的壁纸模式&#xff0c;则能让其更好地融入家居环境&#xf…

ASN.1语言详解(编码规则、关键字、符号、数据类型)

目录 一. ASN.1基本信息 ▐ ASN.1编码规则 二. ASN.1语法规范 ▐ ASN.1的关键字 ▐ ASN.1的符号 ▐ ASN.1的数据类型 ▐ 示例 一. ASN.1基本信息 ASN.1&#xff08;Abstract Syntax Notation One&#xff09;是一种国际标准&#xff08;由ITU-T X.680系列建议定义&#…

自定义注解获取属性对应枚举的翻译值

平时在开发的时候难免会遇到枚举来翻译类&#xff0c;于是写一个自定义注解来在开发的时候自动翻译枚举的值 相关代码如下&#xff1a; Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) Documented JacksonAnnotationsInside public interface EnumShow {/*** …

农场app开发,在“小小”的土地上开出“大大”的花

随着经济与科技的不断发展&#xff0c;人们对所供应的健康食品&#xff0c;提出了新的需求。即人们希望可以查到其产地、种植方式、采摘时间、有机、无机等多个层面。农场app的开发&#xff0c;致力于帮助人们满足这一具体化需求。 一&#xff0e; 农场app开发的底层逻辑 农场…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…

SpringBoot修改banner

在resources目录下创建banner.txt文件 到该网站下选择banner https://www.bootschool.net/ascii-art 点击拷贝&#xff1a; 粘贴到banner.txt中&#xff0c;保存 重新运行项目即可&#xff1a;

Spring Boot集成websocket实现webrtc功能

1.什么是webrtc&#xff1f; WebRTC 是 Web 实时通信&#xff08;Real-Time Communication&#xff09;的缩写&#xff0c;它既是 API 也是协议。WebRTC 协议是两个 WebRTC Agent 协商双向安全实时通信的一组规则。开发人员可以通过 WebRTC API 使用 WebRTC 协议。目前 WebRTC…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Java内存模型(JMM)详解

文章目录 1、Java内存模型2、JMM的核心概念1&#xff09;主内存与工作内存2&#xff09;内存可见性3&#xff09;JMM的三大特性&#xff1a;原子性、可见性、有序性。 3、JMM中的八种操作4、Happens-before 规则5、样例&#xff1a; 1、Java内存模型 Java内存模型&#xff08;…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

gridview自带编辑功能如何判断用户修改的值的合法性

在使用GridView的编辑功能更新值时&#xff0c;确保输入的值合法性是十分重要的。为了实现这一点&#xff0c;你可以在GridView的RowUpdating事件中加入代码来检查用户输入的值。如果发现输入的值不合法&#xff0c;你可以取消更新操作并向用户显示错误消息。下面是如何实现的步…

区区微服务,何足挂齿?

背景 睿哥前天吩咐我去了解一下微服务&#xff0c;我本来想周末看的&#xff0c;结果周末没带电脑&#xff0c;所以只能周一看了。刚刚我就去慕课网看了相关的视频&#xff0c;然后写一篇文章总结一下。这篇文章算是基础理论版&#xff0c;等我之后进行更多的实践&#xff0c;…

Matlab初识:什么是Matlab?它的历史、发展和应用领域

目录 一、什么是Matlab&#xff1f; 二、Matlab的历史与发展 三、Matlab的应用领域 四、安装和启动Matlab 五、界面介绍 六、第一个Matlab程序 七、总结 一、什么是Matlab&#xff1f; Matlab 是由 MathWorks 公司开发的一款用于数值计算、可视化以及编程的高级技术计算…

vue中axios从content-disposition响应头获取中文名

在Vue中使用axios请求文件时&#xff0c;服务器可能会返回带有Content-Disposition响应头的文件&#xff0c;其中可能包含文件名的编码信息。如果你需要解码这个文件名&#xff0c;可以使用JavaScript的内置URL API来处理。 Java中用于设置HTTP响应头的&#xff0c;通常在Web开…

HTML5新标签

HTML5 特点 新标签 <header>...<header> 头部标签 <footer>...<footer> 尾部标签 <section>...<section> 内容区块 <article>...&#xff0c;article> 表示页面中的独立内容 <aside>...<aside> 标签定义其所处…

JavaScript Window对象之(BOM、JS 执行机制、location对象、navigator对象、histroy对象、本地存储)

目录 1. BOM(浏览器对象模型)2. JS 执行机制3. location对象4. navigator对象5. histroy对象6. 本地存储6.1 localStorage6.2 sessionStorage 1. BOM(浏览器对象模型) BOM(Browser Object Model)是浏览器对象模型。其中window对象是JavaScript中一个全局的顶级对象基本的BOM属性…

定个小目标之刷LeetCode热题(23)

今天写这道题&#xff0c;背过八股文的都应该知道LRU算法缓存的基本原理&#xff0c;在 Java 语言中&#xff0c;同样有类似的数据结构 LinkedHashMap&#xff0c;本题我们采用自己创建哈希表双链表的形式简单实现一下 对于get操作&#xff1a;通过cache.get(key)获取&#xff…

【经典爬虫案例】用Python爬取微博热搜榜!

一、爬取目标 本次爬取的是: 微博热搜榜 &#xff08;代码也可直接在下方拿&#xff09;&#xff1a; ​ 分别爬取每条热搜的&#xff1a; 热搜标题、热搜排名、热搜类别、热度、链接地址。 下面&#xff0c;对页面进行分析。 经过分析&#xff0c;此页面没有XHR链接通过&am…