《C++入门攻略》(小白向)

news2024/11/28 4:33:51

函数

函数、输入、传参

在程序中使用函数时,你必须先声明它然后再定义声明的目的是告诉编译器你即将要定义的函数的名字是什么,返回值的类型是什么以及参数是什么而定义则是告诉编译器这个函数的功能是什么。假如我们不声明,那么该函数就不能被其他函数调用通常我们把函数声明叫做函数原型,而把函数定义叫函数实现。

#include<bits/stdc++.h>
using namespace std;
using std::cout;
using std::endl;
void  show()
{
    int lf = 123;
    std::cout << "hello world";
    //return lf;
}
void lf(string name, int age)
{   
    cout << name << age << endl;
}
int count(int a, int b)
{
    return a + b;
}
int main()
{
    //show();
    //std:cout << s << endl;
    lf("lf", 12);
    cout <<count(1,2) << endl;
    
    int a, b;
    cout << "请依次输入两个数字进行求和:"<<endl;
    cin >> a; //用a保存接受用户输入
    cin >> b;
    cout << count(a, b) << endl;
    return 0;
}

函数声明

在程序中使用函数时,你必须先声明它然后再定义声明的目的是告诉编译器你即将要定义的函数的名字是什么,返回值的类型是什么以及参数是什么而定义则是告诉编译器这个函数的功能是什么。假如我们不声明,那么该函数就不能被其他函数调用通常我们把函数声明叫做函数原型,而把函数定义叫函数实现。

先声明再调用就不会出现找不到的情况,只要声明了就会保存在内存空间,直到找到函数的实现

#include<bits/stdc++.h>
using namespace std;

void A();
void B();
void A()
{
    cout << "A\n";
    B();
}
void B()
{
    cout << "B\n";
    A();
}
int main()
{
    A();
    B();
    return 0;
}

局部变量

只能存活在swap函数之内,swap结束之后,swap函数内的局部变量也就被销毁掉了

因此具体的交换只能反映再swap函数之内,而不能反映在swap函数之外

#include<bits/stdc++.h>
using namespace std;

void swap(int, int);
int main()
{
    int x = 3, y = 4;
    cout << " main before"<<x << y << endl;
    swap(x, y);
    cout << " main after" << x << y << endl;
    return 0;
}
void swap(int x, int y)
{
    cout << "swap  before" << x << y << endl;
    int c = x;
    x = y;
    y = c;
    cout << "swap  after" << x << y << endl;
}

全局变量

#include<bits/stdc++.h>
using namespace std;

void swap(int, int);
int x = 3, y = 4;
int main()
{
    int x = 3000, y = 4000;
    cout << " main before"<<x << y << endl;
    swap(x, y);
    cout << " main after" << x << y << endl;
    return 0;
}
void swap(int x, int y)
{
    cout << "swap  before" << x << y << endl;
    int c = x;
    x = y;
    y = c;
    cout << "swap  after" << x << y << endl;
}

数据的类型

字符型

#include<bits/stdc++.h>
using namespace std;

int main()
{
    char ch = 65;
    cout << ch << endl;
    cout << (int)ch;
    for (int i = 32; i < 128; i++)
    {
        cout << (char)i << endl;
    }
    return 0;
}

双字节型

#include<bits/stdc++.h>
#include<locale>
using namespace std;

int main()
{
    //设置所有的为中文类型
    setlocale(LC_ALL,"chs");
    wchar_t wt[] = L"中";
    //wcout代替cout进行输出,因为cout无法输出宽字节型
    wcout << wt;
    return 0;
}

整型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTZl9mAO-1684232872982)(https://gitee.com/lfzxmw/img/raw/master/img/image-20230513183722133.png)]

#include<bits/stdc++.h>
#include<locale>
using namespace std;

int main()
{
    cout << sizeof(int) << endl;
    cout << sizeof(short) << endl;
    cout << sizeof(long) << endl;

    unsigned int a;
    cout << sizeof(unsigned int) << endl;
    unsigned short b;
    cout << sizeof(unsigned short) << endl;
    unsigned long c;
    cout << sizeof(unsigned long) << endl;
    return 0;
}

数据溢出

从该程序中我们看出整型数据溢出后不会报错,而是象汽车里程表那样,到达最大值后,又从最小值开始因此我们需要时刻注意所定义变量的最大取值计数。范围,一定不要超过这个范围进行赋值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P5ek8dWu-1684232872984)(https://gitee.com/lfzxmw/img/raw/master/img/image-20230513184402584.png)]
在这里插入图片描述

浮点型

使用了头文件iomanip 中的函数 setprecision(),该函数用来设置输出的精度也就是用来设置输出多少位数字,

假如我们将其设置为 15,那么程序就将输出 15 位数字,即使不够,也要凑够15位并输出。

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	float a = 1.2342421;
	cout << setprecision(15) << a;
	return 0;
}

枚举型常量

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	enum num { zero = 1, one, two = 200,three,four };
	cout << zero << "\t" << one << "\t" << two << "\t" << three << "\t" << four;
	return 0;
}

用enum定义了一个枚举型常量day:它有7个值,每个值对应一个整数从0开始计数,这样星期一(Monday)的值为1,

而星期六(Saturday)的值则为6。

#include<bits/stdc++.h>
#include<iomanip>
using namespace std;


int main()
{
	enum day { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Satuday };
	day today;//创建一个变量today
	today = Monday;
	cout << today; //输出为1
	if (today == Satuday || today == Sunday) 
	{
		cout << "休息\n";
	}
	else
	{
		cout << "上班\n";
	}
	return 0;
}

数组

逆序题

交换位置,只需要交换一半的位置就可以了

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;


int main()
{
	int arr[] = {1,2,3,4,5};
	int temp = 0;
	int length = sizeof(arr) / sizeof(int);
	int end = sizeof(arr) / sizeof(int) - 1;

	for (int i = 0; i < length/2; i++)
	{
		temp = arr[i];
		arr[i] = arr[end];
		arr[end] = temp;
		end--;
	}
	for (int t : arr) {
		cout << t << " ";
	}
	return 0;
}

二维数组题目

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;


int main()
{
	//建立二维数组(初始化)
	int scores[3][3];
	string names[3] = { "张三","李四","王五" };
	//赋三科分数
	int a = 0;
	int b = 0;
	int c = 0;
	//计数(下标)
	int n = 0;
	int m = 0;
	//总分
	int sum[3];
	do {
		cout << "请分别输入" << names[n] << "的三科成绩:" << endl;
		cin >> a >> b >> c;
		sum[n] = a + b + c;
		scores[n][m++] = a;
		scores[n][m++] = b;
		scores[n][m] = c;
		m = 0;//置为0
		n++;
		cout << endl;
	} while (n < 3);
	//输出
	for (int i = 0; i < 3; i++) {
		cout << names[i] << "的总成绩为" << sum[i] << endl;
	}


	return 0;
}

面向对象(类)

#include<bits/stdc++.h>
#include<iomanip>
//#include <typeinfo>
using namespace std;
class Human
{
public:
	void walk() { cout << "walk\n"; };
	void speak() { cout << "speak\n"; };
	void run() { cout << "run\n"; };
	void eat() { cout << "eat\n"; };
};


int main()
{
	Human lf;
	lf.walk();
	lf.speak();
	lf.run();
	lf.eat();

	return 0;
}

指针

#include<bits/stdc++.h>
using namespace std;

int main() {
    int i = 1;
    //cout << &i ;

    int a  = 1;
    int* p;
    p = &a;
    cout << &a << " " << p << " " << *p<<" " << a<<endl;

    cout << "--------------------"<<endl;

    return 0;
}
#include<bits/stdc++.h>
using namespace std;

int main() {
    int i = 1;
    int* p = 0;
    cout << &i <<" " << i <<" " << &p<< " " << p;
    return 0;
}

创建堆

C++中使用关键字new创建一个堆并分配内存

#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    *p = 4;
    cout << *p;
    return 0;
}

请不要再次对该指针进行删除,因为它所指向的内存区域已经被释放,如果再进行释放,将会使程序崩溃。不过,假如我们将该指针赋为0的话,那么删除一个空指针将是安全的

#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    delete p;
    p = 0;
    delete p;
}
#include<bits/stdc++.h>
using namespace std;
typedef unsigned short int ut;

int main() {
    int* p = new int;
    *p = 3600;
    cout << *p << endl;
    delete p;
    cout << *p << endl;
    p = 0;
    p = new int;
    *p = 8;
    cout << *p << endl;
    delete p;
    return 0;
}

内存泄漏

就会造成内存泄露,这是因为,第 1行定义了一个指针p 并使其指向一块内存空间,第2行又将一块新的内存空间的地址赋给了 P。这样第1行所开的那块内存空间就无法再使用了因为指向它的指针现在已经指向了第2块空间。
指针变量p只能保存一个地址,如对它重新赋值,则表示以前的地址被覆盖,假如该地址的内存空间没有被释放,那么你将无法再次通过指针p 访问它是第2块内存的地址

	int* p = new int;
    delete p;
	p = new int;

this指针

学生在发新课本时一般都要将自己的名字写在课本上,以说明该课本是自己的,避免与其他人的混淆。对象也要在属于自己的每个成员身上写下自己的名字,以证明该成员是自己的成员,而不是其他对象的成员。this 变量帮助对象做到这一点this 变量记录每个对象的内存地址然后通过间接访问运算符->访问该对象的成员。例程如下:

#include<bits/stdc++.h>
using namespace std;

class A
{
public:
    int get() { return i; }
    void set(int x) {
        this->i = x;
        cout << this << endl;
    }
private:
    int i;
};
int main() {
    A a;
    a.set(9);
    cout << a.get() << endl;
    A b;
    b.set(10);
    cout << b.get() << endl;

    return 0;
}

引用

引用的作用

引用在C++中有以下几个主要作用:

  1. 别名: 引用允许我们创建变量的别名,可以通过不同的名称来访问同一变量或对象,从而使代码更加灵活易读。
  2. 函数参数传递: 通过将函数参数声明为引用,函数可以直接修改调用者传递的变量,而无需使用指针或复制数据。这种方式避免了对大型结构体或对象进行值传递时的开销,提高程序效率。
  3. 返回值: 函数可以返回引用类型,以便调用者可以使用相同的名称访问函数返回的变量或对象。这也可以避免大型结构体或对象复制的开销,提高程序效率。

引用并不是值传递,而是通过地址传递。当我们将一个变量作为引用传递给函数时,函数得到的是该变量的地址,而不是变量的副本。因此,对引用所代表的变量进行的任何修改都会影响到原始变量。与之相反,当我们将变量作为值传递给函数时,函数得到的是该变量的一个副本,对副本的修改不会影响到原始变量

引用和指针的区别

引用和指针都可以用于间接访问变量或对象,但它们之间有以下几个区别:

  1. 语法: 引用使用&符号进行声明,而指针使用*符号进行声明。
  2. 空值: 指针可以为NULL或nullptr,表示指向空地址;而引用必须始终指向某个有效的对象。
  3. 初始化: 在声明时,引用必须被初始化为某个对象,而指针则可以在任何时候被初始化或赋值为一个地址。
  4. 可更改性: 一旦引用被初始化为某个对象,就不能再更改它的引用对象;而指针可以在任何时候重新分配到另一个对象。
  5. 所指对象的内存管理: 指针可以进行动态内存分配和释放,因此需要程序员手动管理内存;而引用只是对已经存在的对象的引用,无需手动管理内存。

需要注意的是,引用实际上是通过指针来实现的。当我们创建一个引用时,编译器会为该引用创建一个指针,并将其自动关联到所引用的变量。因此,从内部机制上说,引用和指针是密切相关的。

引用和指针都可以被视为值传递的方式,因为它们传递的是内存地址(即指向实际数据的指针),而不是数据本身。当使用引用或指针时,对该地址上的数据进行更改会影响原始数据。

#include<bits/stdc++.h>
using namespace std;


int main() {
    int a;
    int& ra = a;
    a = 999;
    cout << typeid(&a).name() << endl;
    cout << typeid(&ra).name() << endl;
    cout << &a << endl;
    cout << &ra << endl;

    return 0;
}

C++ STL 教程

在前面的章节中,我们已经学习了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件描述
容器(Containers)容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms)算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators)迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:

实例

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
   // 创建一个向量存储 int
   vector<int> vec; 
   int i;
 
   // 显示 vec 的原始大小
   cout << "vector size = " << vec.size() << endl;
 
   // 推入 5 个值到向量中
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }
 
   // 显示 vec 扩展后的大小
   cout << "extended vector size = " << vec.size() << endl;
 
   // 访问向量中的 5 个值
   for(i = 0; i < 5; i++){
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }
 
   // 使用迭代器 iterator 访问值
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
      cout << "value of v = " << *v << endl;
      v++;
   }
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

关于上面实例中所使用的各种函数,有几点要注意:

  • push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
  • size( ) 函数显示向量的大小。
  • begin( ) 函数返回一个指向向量开头的迭代器。
  • end( ) 函数返回一个指向向量末尾的迭代器

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

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

相关文章

vue快速上手教程与简单安装

目录 vue简介 vue实例 通过 CDN 使用 Vue NPM 方法 介绍 下载 使用 vue简介 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 vue实例…

ping包过程之arp(地址解析协议)

0,怎么引出arp地址解析协议的呢&#xff1f; 在硬件层次上进行的数据帧交换必须有正确的接口地址&#xff08;既是MAC地址&#xff09;。但是&#xff0c; T C P / I P有自己的地址&#xff1a; 32 bit的I P地址。知道主机的 I P地址并不能让内核发送一帧数据给主机。内核&…

二十、Zipkin持久化链路跟踪

目录 Zipkin持久化 使用mysql数据库持久化 1、创建zipkin数据库 2、启动zipkin使用以下脚本 3、访问接口&#xff08;配置了sleuth链路跟踪&#xff09; 使用ElasticSearch持久化 zipkin启动脚本 Zipkin持久化 Zipkin server默认会将追踪数据信息保存在内存中&#xff0…

NoSQL之Redis配置与数据库常用命令

目录 一、关系型数据库与非关系型数据库概述1.1 关系型数据库1.2 非关系型数据库 二、关系型数据库与非关系型数据库的区别2.1 数据的存储方式不一样2.2 扩展的方式不同2.3 对事务性的支持不同 三、非关系型数据库产生背景四、Redis简介4.1 Redis的单线程模式4.2 Redis优点4.3 …

B2B 客户支持,如何做好?

多年来&#xff0c;基于尖端技术的现代和个性化客户体验一直主导着企业对消费者&#xff08;B2C&#xff09;领域。然而&#xff0c;在企业对企业&#xff08;B2B&#xff09;行业中&#xff0c;出色的客户体验变得比以往任何时候都更加重要。许多组织正在开发类似于B2C市场中个…

无延迟直播/超低延迟直播快速接入的示例

简要说明 接入无延迟直播/超低延迟直播播放前&#xff0c;需确保直播间频道是无延迟频道&#xff0c;SDK中使用无延迟与常规播放无异&#xff0c;只需加入若干配置就可以快速接入。 什么是无延迟/超低延迟直播&#xff0c;可参见我的这篇文章&#xff1a; 无延时直播/超低延时…

Java 基础进阶篇(十四)—— File类常用方法

File 类的对象代表操作系统的文件&#xff08;文件、文件夹&#xff09;&#xff0c;File 类在 java.io.File 包下。 File 类提供了诸如&#xff1a;创建文件对象代表文件&#xff0c;获取文件信息&#xff08;大小、修改时间&#xff09;、删除文件、创建文件&#xff08;文件…

【软件测试与质量保证】期末复习2(HITWH)(软件测试部分)

更多复习资料在下方链接获取&#xff1b;包括复习笔记&#xff08;有具体习题&#xff09;、习题答案以及设计题示例 链接&#xff1a;复习资料 复习笔记里的习题不包含答案&#xff0c;具体答案在【云班课答案】文件夹中&#xff0c;顺序都是一一对应的&#xff0c;喜欢刷题可…

进程间通信之管道篇

&#x1f3c6;一、进程间通信目的 1.1什么是通信 进程是具有独立性的&#xff0c;而我们要实现进程间通信的目标&#xff0c;是需要开辟空间和创造方法的。 通信目的&#xff1a; 1、数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 2、资源共享&#xff1a;…

CSAPP 第六章存储器的结构层次

源程序 执行程序 空间代码都要存在外存上&#xff0c;程序运行的时候操作系统要把外存的东西加载到内存里&#xff0c;CPU要从内存一行一行的读、译码和分析 我们来看一个例子&#xff1a; 指令位于内存中的代码段中&#xff0c;必须从内存中读出来进行译码分析之后才能运行 指…

细说java动态代理及使用场景

一、定义 Java代理模式是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来间接访问另一个对象&#xff0c;从而控制对原始对象的访问。 1.1 作用 1、在访问原始对象时增加额外功能&#xff0c;如访问前或访问后添加一些额外的行为。 2、控制对原始对象的访问。 J…

热水智能控制系统有什么优点?

热水智能控制系统是一种先进的技术&#xff0c;可以极大地提高家庭和商业场所的热水使用效率&#xff0c;降低能源消耗和运营成本。这种系统利用现代化的传感器、控制器和通讯技术&#xff0c;可以智能地监测和控制热水的温度、流量和使用情况&#xff0c;并根据实际需求来调节…

ASEMI代理ADI亚德诺ADM706SARZ-REEL原厂芯片

编辑-Z ADM706SARZ-REEL参数描述&#xff1a; 型号&#xff1a;ADM706SARZ-REEL VCC工作电压范围&#xff1a;1.0-5.5V 电源电流&#xff1a;100μA 重置阈值滞后&#xff1a;20 mV 复位脉冲宽度&#xff1a;200 ms PFI输入阈值&#xff1a;1.25V PFI输入电流&#xff…

Linux 部署 scrapydweb

一、 创建虚拟环境&#xff0c;在虚拟环境下操作 1、安装scrapyd pip install scrapyd2、安装scrapyd-client pip install scrapyd-client3、安装scrapydweb pip install scrapydweb4、安装Logparser pip install Logparser二、新建一个scracyd的配置文件 sudo mkdir /etc/scr…

MySql.Data.dll 因版本问题造成报错的处理

NetCore 链接MySQL 报 Character set ‘utf8mb3‘ is not supported by .Net Framework 异常解决_character set utf8mb3_csdn_aspnet的博客-CSDN博客 查看mysql版本号&#xff0c;两种办法&#xff1a; 第一种在数据库中执行查询&#xff1a;SELECT version; 第二种使用工具…

数据治理和合规性:如何确保大数据应用遵守法规和标准

第一章&#xff1a;引言 在数字时代&#xff0c;大数据的应用日益普遍&#xff0c;对企业和组织的决策、运营和创新产生了深远的影响。然而&#xff0c;随着数据规模的不断增长&#xff0c;以及数据泄露和滥用事件的频繁发生&#xff0c;数据治理和合规性问题愈发突显。企业和…

推荐系统用户长序列建模

目录 一、背景 二、技术方案 2.1 DIN 简介 论文细节 优缺点 2.2 DINE 简介 论文细节 2.3 MIMN 简介 论文细节 2.4 SIM 简介 论文细节 优缺点 2.5 DSIN 简介 论文细节 一、背景 阿里巴巴的精排模型从传统lr&#xff0c;到深度学习&#xff0c;再到对用户长历…

使用云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么&#xff1f;阿里云百科分享使用阿里云服务器常用的十大使用场景&#xff0c;说是十大场景实际上用途有很多&#xff0c;阿里云百科分享常见的云服务器使用场景&#xff0c;如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

6年测试,不断磨炼升级打怪自动化测试,一路晋升他终于冲出月35k+

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

ViT 论文逐段精读

https://www.bilibili.com/video/BV15P4y137jb Vision Transformer 挑战了 CNN 在 CV 中绝对的统治地位。Vision Transformer 得出的结论是如果在足够多的数据上做预训练&#xff0c;在不依赖 CNN 的基础上&#xff0c;直接用自然语言上的 Transformer 也能 CV 问题解决得很好…