c++关键字const
C++中的const是一种常量修饰符。在变量、函数参数和成员函数中使用const可以限制其对数据的修改。
const修饰的数据在定义时必须进行初始化,且不能被修改,因此使用const可以提高代码的安全性和可读性。在C++中,const修饰的成员函数表示该函数保证不会修改类的成员变量,从而保证对象的状态不会被改变。使用const修饰的成员函数可以帮助程序员更好地实现不变类(不修改内部状态的类)和避免不必要的拷贝构造函数的调用。
C++中使用`const`的主要目的是为了告诉编译器某些变量或函数参数、类成员函数、关键字等不会被修改,从而提高代码的可读性、可维护性和安全性。使用`const`的主要注意事项如下:
1. 使用const修饰变量
使用const修饰变量时,需要注意以下几点:
- 定义时必须进行初始化,一旦初始化后,就不能再修改变量的值。
- const定义的常量存放在静态存储区,而不是栈中。
- 通常采用const全大写的命名方式来表示常量,提高可读性。
- 在函数参数列表中,const修饰的参数表明函数不能修改该参数的值。
2. 在类中使用const修饰成员变量
在类中使用const修饰成员变量时,需要注意以下几点:
- const成员变量必须在定义时进行初始化,在构造函数中无法进行初始化。
- const成员变量只能通过成员初始化列表进行初始化。
- 可以在构造函数中通过调用其他函数或者使用默认参数对const成员变量进行初始化。
- const成员变量的值不能在构造函数中被修改。
3. 在类中使用const修饰成员函数
在类中使用const修饰成员函数时,需要注意以下几点:
- const成员函数不能修改类的非静态成员变量。
- 如果类中有一个const成员函数,那么该成员函数是类的常量成员函数,只能被const对象调用,不能被非const对象调用。
- 具有相同名称和参数的另外一个非const成员函数可以修改类的成员变量。
使用const可以使你的代码更加安全、可读性更高,并且有助于防止一些不必要的错误。
为了避免const使用时出现的错误,需要在使用时注意以上细节,如常量的定义和初始化、使用const修饰的指针、const修饰的成员变量和成员函数、以及常量对象的初始化等细节。
// const修饰变量
#include <iostream>int main()
{// 定义并初始化Nconst int N = 10;// 使用const修饰变量N,使其成为一个常量。因为N是常量,所以可以用它定义数组并使用,但是在后面试图修改N的值是会编译错误。int arr[N];for (int i = 0; i < N; i++){arr[i] = i;std::cout << arr[i] << " ";}std::cout << std::endl;//const修饰的N不能修改, 编译报错,error: assignment of read-only variable ‘N’// N = 20;return 0;
}
// const修饰函数参数
#include <iostream>// const修饰函数参数
void arrPrint(const int arr[], const int size)
{for (int i = 0; i < size; i++){std::cout << arr[i] << " ";}std::cout << std::endl;// const修饰的参数不能修改,编译报错试图对只读的数组元素进行赋值。error: assignment of read-only location ‘* arr’// arr[0] = 10;// size = 6;
}int main()
{int arr[5] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);arrPrint(arr, size);return 0;
}
// const修饰成员函数
#include <iostream>class Circle {
public:// 常量数据成员通常不直接在声明时初始化赋值,不合适,一般使用成员初始化列表进行赋值Circle(double r) : radius(r) {}// const修饰成员函数double getArea() const {return 3.1415926 * radius * radius;}// const修饰成员函数double getRadius() const {// const修饰的radius不能修改,编译报错,error: assignment of member ‘Circle::radius’ in read-only object// radius = 3;return radius;}// const修饰数据成员const double radius;// 常量数据成员通常不直接在声明时初始化赋值,不合适,一般使用成员初始化列表进行赋值// const double radius = 5.0;
};int main()
{Circle c(5.0);std::cout << "radius : " << c.getRadius() << std::endl;std::cout << "area : " << c.getArea() << std::endl;// const修饰的radius不能修改,编译报错,error: assignment of read-only member ‘Circle::radius’// c.radius = 3;return 0;
}
// const修饰的类枚举
#include <iostream>class Shape {
public:enum class Type : int {Circle = 0,Square = 1,};Shape(Type t) : type(t) {}void getType() const {switch (type){case Type::Circle:std::cout << "circle" << std::endl;break;case Type::Square :std::cout << "square" << std::endl;default:break;}}// const修饰的类枚举const Type type;
};int main()
{// 创建Shape对象,指定类型为CircleShape c(Shape::Type::Circle);c.getType();Shape s(Shape::Type::Square);s.getType();// const修饰的类枚举不能修改,编译错误,error: assignment of read-only member ‘Shape::type’// c.type = Shape::Type::Square;return 0;
}
// const修饰的静态类变量
#include <iostream>class Counter {
public:Counter() {count++;}Counter(const Counter & c) {count++;}static int getCount() {return count;}
private:// const修饰的静态成员变量static const int LIMIT = 10;// 类静态变量static int count;
};
// 定义静态成员变量
int Counter::count = 0;int main()
{Counter c1, c2, c3;std::cout << "count : " << Counter::getCount() << std::endl;// const修饰的类静态变量不能修改,编译错误,error: assignment of read-only variable ‘Counter::LIMIT’// Counter::LIMIT = 20;return 0;
}
// const修饰的非静态成员函数
#include <iostream>class Circle{
public:Circle(double r) : radius(r) {}double getArea() const {return PI * radius * radius;}double getRadius() const {return radius;}private:// 定义静态常量static const double PI;double radius;
};const double Circle::PI = 3.1415926;int main()
{const Circle c(5.0);std::cout << "area : " << c.getArea() << std::endl;return 0;
}
// const修饰的类转换函数
#include <iostream>class Point {
public:Point(int x, int y) : _x(x), _y(y) {}int getX() const {return _x;}int getY() const {return _y;}// 类中定义了一个使用const修饰的类转换函数:`operator int()`。// 该函数将一个Point对象转换为一个整数,这里我们将`_x`和`_y`简单地相加。// 在`main()`函数中,我们创建了一个`Point`对象,并将其转换为整数输出。// 由于在类转换函数中使用了const修饰,保证了不会修改对象operator int() const {return _x + _y;}
private:int _x;int _y;
};int main()
{Point p(3, 4);std::cout << static_cast<int>(p) << std::endl;return 0;
}
// const在函数前面修饰
// 在C++中,const可以用在函数的前面和后面,
// 用在函数后面是用来修饰成员函数,用在函数前面则是用来修饰函数返回值。它们的区别在于const的含义不同。
// const修饰成员函数和修饰函数返回值都能达到保护数据不被修改的目的,但用法和意义不同。必须根据实际情况选择适当的修饰。
// const在函数前面为常量函数,const在函数后面为常量成员函数
// 常量成员函数用于定义不能修改任何非静态成员数据的函数(或称“只读”函数),而常量函数用于定义不能修改其返回值的函数,使返回值更安全。
#include <iostream>class Rectangle {
public:Rectangle(int w, int h) : width(w), height(h) {}// const在函数后面用来修饰成员函数,表示该成员函数是一个常量成员函数,不能修改类的非静态成员变量。// 常量成员函数也不能被非const对象调用。int getArea() const;// 返回值类型为`const int &`,表示返回的是一个常量引用,不能修改它所引用的变量。// const在函数前面用来修饰函数返回值,表示该函数返回的值是一个常量。// 通常用于返回一个常量指针或常量引用,以避免返回值被修改。const int &max(const int &a, const int &b) {return (a > b) ? a : b;}// C++中`const`关键字可以用在函数返回值的前面或后面,// 用在函数返回类型前面就表示返回值是一个`const`常量,用在类型后面表示该函数是一个常量函数。// 所以`int const func()`和`const int func()`是等同的,它们都表示一个返回值是`const int`类型的函数。// 这种用法通常用于返回一个常量对象,或常量指针、常量引用等等,以避免返回值被修改。const int get100() {return 100;}int const get200() {// const修饰的是返回值,函数可以修改成员变量的值this->width = 200;return 200;}int getWidth() const {// 函数被声明为常量成员函数,因此不能修改成员变量的值// 不能修改成员变量,编译错误,error: assignment of member ‘Rectangle::m_val’ in read-only object// this->m_val = 100;return this->width;}void setValue(int value) {this->width = value;}// 当`const`关键字放在成员函数的前面时,它修饰的是函数的返回值,表示这个函数的返回值是一个常量。// 这种函数返回类型前加`const`关键字的写法,通常用于返回一个常量整数、常量指针或常量引用等,以避免返回值被修改。// 常量函数的常量限制作用于函数的返回值上,而非函数的实现代码中。// 函数的返回值类型被定义成`const int`,表明函数返回了一个常量整数const int getHeight() const {return this->height;}
private:int width, height;
};// 常成员函数,在函数尾部加const,常成员函数在类外实现的时候const不能丢掉,因为const时函数的一部分
// 在常成员函数中不能修改任何数据成员的值,常成员函数内不能对类的任何数据成员进行修改,
// 即当前类中凡是能用this指出来的成员都改不了,但是可以访问,就是只能看不能改,但是静态成员变量可以修改。
int Rectangle::getArea() const {// error: assignment of member ‘Rectangle::width’ in read-only object// width = 10;return width * height;
}int main()
{const Rectangle r(5, 10);std::cout << "area : " << r.getArea() << std::endl;// const放函数前面Rectangle r1(5, 10);// 常量引用`maxVal`来引用`max()`函数返回的值,因此不能修改`maxVal`的值。// 报错,error: passing ‘const Rectangle’ as ‘this’ argument discards qualifiers [-fpermissive]// const int & max = r.max(5, 10);const int & maxVal = r1.max(5, 10);// error: assignment of read-only reference ‘maxVal’// maxVal = 20;std::cout << "max val : " << maxVal << std::endl;// 报错,error: passing ‘const Rectangle’ as ‘this’ argument discards qualifiers [-fpermissive]// r.get100();const int a1 = r1.get100();// 报错,error: expected initializer before ‘a2’// 这个错误是因为`r1`对象是一个`const`对象,在`const`对象上调用非常量成员函数是不允许的,// 因为非常量成员函数可以修改对象的状态,会破坏对象的不可变性。// int cosnt a2 = r1.get100();std::cout << "get100 : " << r1.get100() << std::endl;std::cout << "get200 : " << r1.get200() << std::endl;// 创建了一个常量对象`obj`,也不能修改其中的成员变量。const Rectangle obj0(10, 20);std::cout << obj0.getWidth() << std::endl;// 不能修改常量对象的成员变量,编译错误,error: passing ‘const Rectangle’ as ‘this’ argument discards qualifiers [-fpermissive]// obj0.setValue(10);Rectangle obj1(10, 30);std::cout << obj1.getHeight() << std::endl;// 通过调用常量函数`obj.getValue()`来获取常量整数值,并将结果保存到一个常量值`value`中,这样可以防止常量值被修改。int a3 = obj1.getHeight();const int a4 = obj1.getHeight();std::cout << "a3 = " << a3 << ", a4 = " << a4 << std::endl;return 0;
}
// 常量成员函数和常量函数的区别
// - 常量成员函数在函数声明的结尾处加上`const`修饰符,用于定义不会修改任何非静态成员数据的函数。
// 也就是说,常量成员函数将其所操作的对象指定为常量,从而导致它不能在函数调用中修改类中的任何非静态成员变量。
// - 常量函数在函数返回类型前加上`const`修饰符,用于定义不能修改其返回值的函数。
// 也就是说,常量函数指定了函数返回的值是一个常量,无法被修改。
#include <iostream>class Rectangle {
public:Rectangle(int width, int height) : m_width(width), m_height(height) {}// 常量成员函数int getArea() const;int getValue() const;void setValue(int value);// 常量函数int const getWidth() const {return m_width;}const int getHeight() const {return m_height;}const int get100() {return m_height;}const int get200() {return m_height;}private:int m_width;int m_height;int m_value;
};// 常成员函数,在函数尾部加const,常成员函数在类外实现的时候const不能丢掉,因为const时函数的一部分
// 在常成员函数中不能修改任何数据成员的值,常成员函数内不能对类的任何数据成员进行修改,
// 即当前类中凡是能用this指出来的成员都改不了,但是可以访问,就是只能看不能改,但是静态成员变量可以修改。
int Rectangle::getArea() const {return m_width * m_height;
}int Rectangle::getValue() const {return m_value;
}void Rectangle::setValue(int value) {m_value = value;
}int main()
{// c++非常量对象可以调用类的常量成员函数,常量对象不能调用非常量成员函数const Rectangle r(3, 4);// 调用常量成员函数std::cout << "Area: " << r.getArea() << std::endl;// 调用常量函数const int value = r.getValue();std::cout << "Value: " << value << std::endl;// 不能在常量对象上调用非常量成员函数// r.setValue(5); // 编译错误const Rectangle r1(10, 20);std::cout << "width : " << r1.getWidth() << ", height : " << r1.getHeight() << std::endl;// 常量对象不能调用非常量成员函数,报错,error: no matching function for call to ‘Rectangle::setValue() const’// r1.setValue();// r1.get100();// r1.get200();return 0;
}
// const常量对象
// C++中,如果对象被声明为常量对象,那么就意味着该对象的值不能被修改。
// 常量对象是指对象在创建后,其值被确定不变,不允许被修改。// 非常量对象可以调用常量成员函数,因为常量成员函数不会修改对象的状态,所以没有任何风险和限制。
// 而常量对象不能调用非常量成员函数,因为非常量成员函数有可能会修改对象的状态,这会与常量对象的定义相矛盾,所以编译器会拒绝这样的调用并报错。
#include <iostream>class Rectangle {
public:Rectangle(int width, int height) : m_width(width), m_height(height) {}int getArea() const;void setValue(int value);
private:int m_width;int m_height;
};// 常成员函数,在函数尾部加const,常成员函数在类外实现的时候const不能丢掉,因为const时函数的一部分
// 在常成员函数中不能修改任何数据成员的值,常成员函数内不能对类的任何数据成员进行修改,
// 即当前类中凡是能用this指出来的成员都改不了,但是可以访问,就是只能看不能改,但是静态成员变量可以修改。
int Rectangle::getArea() const {return m_width * m_height;
}void Rectangle::setValue(int value) {m_width = value;m_height = value;
}int main() {Rectangle r1(2, 3); // 非常量对象// 在C++中,`const`关键字可以用在类型的右侧或左侧。// 当`const`关键字出现在类型名称的左侧时,它会作用于变量名之前的类型部分;// 当`const`关键字出现在类型名称的右侧时,它会作用于变量名之后的类型部分。// int const b = 20; // 常量整数,等价于const int b = 20;// Rectangle const r3(5, 6); // 常量对象,值不可修改,等价于const Rectangle r3(5, 6);const Rectangle r2(3, 4); // 常量对象Rectangle const r3(5, 6); // 常量对象r1.getArea(); // 非常量对象调用常量成员函数r2.getArea(); // 常量对象调用常量成员函数// r2.setValue(5); // 编译错误,常量对象不能调用非常量成员函数r1.setValue(5); // 非常量对象可以调用非常量成员函数return 0;
}
相关文章:
c++关键字const
C中的const是一种常量修饰符。在变量、函数参数和成员函数中使用const可以限制其对数据的修改。 const修饰的数据在定义时必须进行初始化,且不能被修改,因此使用const可以提高代码的安全性和可读性。在C中,const修饰的成员函数表示该函数保证…...

分布式计算平台 Hadoop 简介
Hadoop简介 Hadoop是一种分析和处理大数据的软件平台,是一个用Java语言实现的Apache的开源软件框架,在大量计算机组成的集群中实现了对海量数据的分布式计算。其主要采用MapReduce分布式计算框架,包括根据GFS原理开发的分布式文件系统HDFS、…...
系统学习Python——警告信息的控制模块warnings:常见函数-[warnings.warn]
分类目录:《系统学习Python》总目录 warnings.warn(message, categoryNone, stacklevel1, sourceNone, \*, skip_file_prefixesNone)常备用于引发警告、忽略或者触发异常。 如果给出category参数,则必须是警告类别类 ;默认为UserWarning。 或…...
监听键盘事件vue3封装hooks
监听页面键盘事件,执行对应方法 使用第三方API:vueuse 我封装的: 1. useKeyboardEvent.ts import { useMagicKeys } from vueuse/coreexport function enterKey(f: Function) {const { enter } useMagicKeys()watch(enter, v > {if (…...
Java Stream简化代码
使用原始流以获得更好的性能 使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能。 var array new i…...

py爬虫入门笔记(request.get的使用)
文章目录 Day11. 了解浏览器开发者工具2. Get请求http://baidu.com3. Post请求https://fanyi.baidu.com/sug4. 肯德基小作业 Day21. 正则表达式2. 使用re模块3. 爬取豆瓣电影Top250的第一页4. 爬取豆瓣电影Top250所有的250部电影信息 Day31. xpath的使用2. 认识下载照片线程池的…...
openssl3.2 - 官方demo学习 - encode - rsa_encode.c
文章目录 openssl3.2 - 官方demo学习 - encode - rsa_encode.c概述笔记END openssl3.2 - 官方demo学习 - encode - rsa_encode.c 概述 命令行参数 server_priv_key.pem client_priv_key.pem 这2个证书是前面certs目录里面做的 官方这个程序有bug, 给出2个证书, 还要从屏幕上输…...

Day03
今日任务 链表理论基础203.移除链表元素707.设计链表206.反转链表 链表理论基础 1)单链表 单链表中的指针域只能指向节点的下一个节点 2)双链表 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个…...

adb 常用命令汇总
目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…...

ubuntu 2022.04 安装vcs2018和verdi2018
主要参考网站朋友们的作业。 安装时参考: ubuntu18.04安装vcs、verdi2018_ubuntu安装vcs-CSDN博客https://blog.csdn.net/qq_24287711/article/details/130017583 编译时参考: 【ASIC】VCS报Error-[VCS_COM_UNE] Cannot find VCS compiler解决方法_e…...
品牌推广与情绪价值的深度结合:市场大局下的新趋势与“准”原则
随着社会经济的快速发展和消费者心理的复杂化,品牌推广已经不再是单一的信息传递,而是一个与消费者建立情感连接、传达品牌价值的过程。在这个过程中,情绪价值起到了至关重要的作用。它不仅影响着消费者的购买决策,更是品牌与消费…...
React16源码: React中的不同的expirationTime的源码实现
不同的 expirationTime 1 )概述 在React中不仅仅有异步任务大部分情况下都是同步的任务,所以会有不同 expirationTime 的存在 2 )种类 A. Sync 模式,优先级最高 任务创建完成之后,立马更新到真正的dom里面是一个创建…...

TRB 2024论文分享:基于生成对抗网络和Transformer模型的交通事件检测混合模型
TRB(Transportation Research Board,美国交通研究委员会,简称TRB)会议是交通研究领域知名度最高学术会议之一,近年来的参会人数已经超过了2万名,是参与人数和国家最多的学术盛会。TRB会议几乎涵盖了交通领域…...
Golang 打包
构建/打包 使用 Go 的构建命令: go build在包含 main 函数的包的目录下执行,它会生成一个可执行文件。文件名默认与包所在的目录名相同,但也可以使用 -o 选项来指定输出的文件名 交叉编译 Windows 环境下进行交叉编译以构建其他平台的可执…...

力扣每日一练(24-1-14)
做过类似的题,一眼就是双指针,刚好也就是题解。 if not nums:return 0p1 0 for p2 in range(1, len(nums)):if nums[p2] ! nums[p1]:p1 1nums[p1] nums[p2]return p1 1 根据规律,重复的数字必定相连,那么只要下一个数字与上一…...

K 个一组翻转链表(链表反转,固定长度反转)(困难)
优质博文:IT-BLOG-CN 一、题目 给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。 k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。…...

Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级
文章目录 Resilience4j概述Resilience4j官方地址Resilience4j-RateLimiter微服务演示Payment processorPOM配置文件ServiceController Payment servicePOMModelServiceRestConfigController配置验证 探究 Rate Limiting请求三次 ,观察等待15秒连续访问6次 Resilienc…...
概率论与数理统计————1.随机事件与概率
一、随机事件 随机试验:满足三个特点 (1)可重复性:可在相同的条件下重复进行 (2)可预知性:每次试验的可能不止一个,事先知道试验的所有可能结果 (3)不确定…...

【生存技能】git操作
先下载git https://git-scm.com/downloads 我这里是win64,下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init,初始化当前目录成为git仓库…...
docker 将镜像打包为 tar 包
目录 1 实现 1 实现 要将镜像导出为.tar包,可以使用Docker命令行工具进行操作。下面是导出镜像的步骤: 首先,使用以下命令列出当前系统上的镜像,并找到要导出的镜像的ID或名称: docker images使用以下命令将镜像导出为…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...