C++(标准输入输出流、命名空间、string字符串、引用)

ops/2024/10/25 5:23:45/

C++特点及优势

        (1)实现了面向对象,在高级语言中,处理运行速度是最快;
        (2)非常灵活,功能非常强大,相对于C的指针优势,C++的优势为性能和类层次结构;
        (3)严谨、精确和数理化........

C++和C语言的区别

        C语言是面向过程的语言,C++是面向对象的语言。

        C++兼容C语言的头文件 #include <cstdio>

标准输入输出

输出流对象(std::cout<<)

        可以自动识别基本类型的输出类型

编译:g++ demo.cpp 

输入流对象(std::cin>>)

        自动识别基本类型的数据类型 

练习:输入一个字符 如果是大写 则转为小写 如果是小写则转为大写

#include <iostream>
int main()
{char c;std::cin >> c;if (c >= 'a' && c <= 'z'){//a = a - 32;std::cout << (char)(c - 32) << std::endl;}else if(c >= 'A' && c <= 'Z'){c += 32;std::cout << c << std::endl;}return 0;
}

cin同时获取多个值

#include <iostream>
int main(int argc, char const *argv[])
{int a;char c;std::cin >> a >> c;std::cout << a << " " << c << std::endl;return 0;
}

命名空间

        避免命名空间污染,C++的标准库都是在std命名空间中定义的(所有的类和对象)。

表示方法

        方式一:using namespace std;
        方式二:std::cout

自定义命名空间 

#include <iostream>
using namespace std;
namespace teacher
{char name[20] = "zhangsan";void showName(){cout << name << endl;}
}
namespace worker
{char name[20] = "lisi";void showName(){cout << name << endl;}
}
using namespace teacher;
using namespace worker;
int main(int argc, char const *argv[])
{//cout << name << endl;    //报错的位置cout << teacher::name << endl;cout << worker::name << endl;cout << "-----------" << endl;teacher::showName();worker::showName();return 0;
}

         teacher和worker命名空间中都有name,如果不写命名空间,会出现访问不明确的错误。 

C++增加bool类型

        (1)bool是基本数据用来表示逻辑真假
        (2)非0为真 true,0为假 false
        (3)增强程序可读性 int isFull();  bool isFull();

字符串处理

        (1)延续C风格,字符数组 char s[20] = "hello";        字符指针 char *s = "hello";
        (2)C++标准库中string类(string不是基本数据类型,而是类类型,对象类型)

创建string对象

#include <iostream> // iostream头文件中包含string头文件,所以可以省略
//#include <string>
using namespace std;
int main()
{string s1 = "hello world";string s2("hello s2");string s3(s2); // s3是用s2复制的string类型对象string s4 = s1; //string对象复制可以通过赋值符号=,直接将值赋予目标对象	cout << "s1:" << s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;cout << "s4:" << s4 << endl;return 0;
}

字符串拼接和比较

        string只能拼接string,拼接其他类型需要使用sprintf()进行复杂的字符串格式化

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1 = "hello";string s2 = "world";s1 += s2;//把s2的字符串追加到s1后面cout<<s1<<endl;//s1 += 1;//错误 string类型的拼接,只能拼接string类型或者C风格字符串char buf[100];sprintf(buf,"%s%d",s1.c_str(),1);//c_str():string类型或者C风格字符串cout<<buf<<endl;//字符串比较cout<<(s1 == s2)<<endl; // 比较的是第一个不相等的ASCII码值cout<<(s1 != s2)<<endl;return 0;
}

empty和size函数

        empty()判断空,如果字符转为空,返回true;否则,返回false
        size()返回字符串长度,和strlen()相同 

#include <iostream>
using namespace std;
int main()
{string s1 = " ";cout << s1.empty() << endl;string s2 = "";cout << s2.empty() << endl;string s3 = "hello world";cout << s3.size() << endl;return 0;
}

cin和getline函数输入字符串

        cin遇到空格结束
        getline函数,输入字符串遇到'\n'结束输入(C++中无法使用gets函数,所以用此函数)

#include <iostream>
using namespace std;
int main()
{string s1;cout << "please input s1" << endl;// 参数1:cin输入流获取字符串,参数2:读取到的字符串存放为止getline(cin,s1);cout << "getine s1:" << s1 << endl;string s2;cout << "please input s2" << endl;cin >> s2;cout << "cin s2:" << s2 << endl;return 0;
}

引用

        引用的本质就是给变量起别名。

#include <iostream>
using namespace std;
int main()
{int a = 10;int& b = a;return 0;
}

特点(重点)

        (1)必须进行初始化
        (2)引用不能单独存在,也不能改变指向
        (3)普通引用不能用常量或者临时值进行初始化

引用作为形参类型 

交换a,b的值

#include <iostream>
using namespace std;
void swap(int& x,int& y)
{int temp;temp = x;x = y;y = temp;
}
int main()
{int a = 10,b = 20;swap(a,b);cout << a << " " << b << endl;return 0;
}

引用作为返回值

        引用作为返回值,是返回变量本身,而不是一个临时的值,要保证变量的生命周期足够长。

const修饰的引用(常引用)

指针的引用和数组的引用

引用和指针的区别(重点)

        (1)不存在空的引用,引用必须连接到一块合法的内存;指针可以是空指针。
        (2)引用被初始化为一个对象,就不能被指向到另一个对象;
                 指针可以在任何时候指向到另一个对象。
        (3)引用必须在创建时被初始化;指针可以在任何时间被赋值。

动态内存分配

        (1)堆区:自定义生命周期(只申请不释放堆区内存,会内存泄漏)
        (2)栈区:作用域结束,变量才释放
        (3)静态变量:程序结束才释放

动态内存的申请和释放 

        new和delete
        C++中new关键字(运算符)申请的内存空间是有类型的给内存初始化,返回指定类型的指针,并且可以自动计算所需大小。

申请变量

#include <iostream>
using namespace std;
int main()
{int* p = new int; // 指针变量p指向,在堆区申请一个int类型的内存*p = 10;delete p; // 释放new在堆区申请int类型空间p = NULL;return 0;
}

申请数组 

#include <iostream>
using namespace std;
int main()
{int* p = new int[10]; // 在堆区申请一个int类型的10个元素的数组delete[] p; // 释放数组p = NULL;return 0;
}

释放指针置空

        delete释放的是指针指向的内存,指针是一个变量,只有在程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容垃圾区域,所以释放内存后把指针指向NULL,防止指针在后面不小心又被解引用。

new和malloc的区别(重点)

        (1)malloc是库函数;new是关键字(运算符)
        (2)malloc申请的空间没有类型(void *),需要强转;new申请的直接初始化
        (3)new会调用构造函数

函数延伸

重载

        英文叫做overload,C++中允许创建多个名称相同的函数,需要满足:
        (1)在同一作用域内,函数名相同,形参列表不同(类型或者个数不同),返回值不作为决定性条件;
        (2)如果参数列表相同,但返回值不同是不可以重载的。 

函数默认参数

        正常来说函数调用时,形参从实参获取值,但是还可以给形参一个默认值,这样形参就不必从实参取值了(一旦某个形参被赋予了默认值,那么其后面的所有形参都必须有默认值)。

        当函数的声明和定义分开写时,只能在声明的部分写默认参数

#include <iostream>
using namespace std;
void fun(int a = 10, int b = 20, int c = 30);
int main()
{fun();fun(1);return 0;
}
void fun(int a, int b, int c)
{cout << a << b << c <<endl;
}

类的初识

栈区创建对象

#include <iostream>
using namespace std;
class Student
{
public:string name;int age;void set(string n, int a){name = n;age = a;}
};
int main(int argc, char *argv[])
{Student s; //栈区实例化对象//直接对成员变量赋值s.name = "zhangsan";s.age = 18;//调用成员函数间接赋值s.set("lisi",20);return 0;
}

堆区创建对象 

int main(int argc, char *argv[])
{Student *s = new Student() ; //在堆区创建一个Student类型对象//直接对成员变量赋值s->name = "zhangsan";s->age = 18;//调用成员函数间接赋值s->set("lisi",20);delete s;s = NULL;return 0;
}


http://www.ppmy.cn/ops/128248.html

相关文章

java集合进阶篇-《HashSet和LinkedHashSet详解》

个人主页→VON 收录专栏→java从入门到起飞 目录 ​编辑 一、前言 二、简要概述 三、Set集合 四、HashSet集合 五、LinkedHashSet集合 一、前言 HashSet集合和LinkHashSet集合都是Set集合的分支集合&#xff0c;语法大致相同。这些众多的集合虽然许多地方都十分相近&…

Unity3D 自动化资源打AB包详解

在Unity3D开发中&#xff0c;AssetBundles&#xff08;简称AB包&#xff09;是一种将资源&#xff08;如模型、纹理、音频等&#xff09;打包成单独文件的方法&#xff0c;这些文件可以在运行时从服务器下载并加载到游戏中。自动化资源打包成AB包可以显著提高开发效率&#xff…

【计网】从零开始认识IP协议 --- 理解网段划分,NAT策略,私有IP和公网IP,认识公网

任何收获都不是偶然&#xff0c; 一点一滴的进步终会让未来的你焕然一新&#xff01; 从零开始认识IP协议 1 为什么要进行网段划分2 特殊IP地址与数量限制3 私有IP和公网IP4 彻底理解网段划分5 认识公网 1 为什么要进行网段划分 我们以一个例子来讲解为什么要进行网段划分&a…

自动驾驶系列—图像数据在自动驾驶中的关键角色及其实际应用场景探讨

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

hardhat部署智能合约

Hardhat安装 安装node 可以使用 nvm 安装node GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions 安装Hardhat 打开命令行工具&#xff0c;输入&#xff1a; mkdir hardhat-demo cd hardhat-demo npm i…

QGIS之三十二DEM地形导出三维模型gltf

效果 1、准备数据 (1)dem.tif (2)dom.tif 2、qgis加载dem和dom数据 3、安装插件 插件步骤可以参考这篇文章 QGIS之二十四安装插件 安装了Qgis2threejs插件,结果

前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏就够用了!机械复试调剂英语自我介绍口语专业面试常见问题总结 机械保研面试

一、开篇寄语&#xff1a; 在准备考研复试的关键时期&#xff0c;许多学弟学妹们往往会寻求各种资料来辅助复习&#xff0c;市面上也因此涌现了大量的“考研复试全流程全攻略”。然而&#xff0c;这些攻略往往存在以下问题&#xff1a; 1、内容不完整性 遗漏关键信息&#x…

Docker可视化管理工具DockerUI的使用

DockerUI是一个易用且轻量化的 Docker 管理工具&#xff0c;透过 Web 界面的操作&#xff0c;更方便对于 Docker 指令不熟悉的用户更容易操作 Docker 。 DockerUI拥有易操作化化界面&#xff0c;不须记忆Docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于 Docker…