const括号前括号后

news2024/12/24 16:36:49

const成员

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数

隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

代码

class Date

{

public:
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout << "Print()" << endl;
 cout << "year:" << _year << endl;
 cout << "month:" << _month << endl;
 cout << "day:" << _day << endl << endl;
 }
 void Print() const

 {
 cout << "Print()const" << endl;
 cout << "year:" << _year << endl;
 cout << "month:" << _month << endl;
 cout << "day:" << _day << endl << endl;
 }

private:
 int _year; // 年

 int _month; // 月

 int _day; // 日

};

void Test()
{
 Date d1(2022,1,13);
 d1.Print();
 const Date d2(2022,1,13);
 d2.Print();
}

 取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

class Date

{ 

public :
 Date* operator&()
 {
 return this ;
 }
 
 const Date* operator&()const

 {
 return this ;
 }

private :
 int _year ; // 年

 int _month ; // 月

 int _day ; // 日

};

在C++中,const关键字在括号前后的位置决定了它的作用域和含义。下面是一些常见的用法和它们之间的区别:

1. const 在类型之前(括号之前)

当const出现在类型之前时,它表示该变量是一个常量,其值在初始化后不能被修改。

const int x = 10; // x 是一个整型常量,其值不能被修改

2. const 在指针类型声明中

const在指针类型声明中的位置决定了它是修饰指针本身还是指针所指向的数据。

const在*之前:表示指针所指向的数据是常量,不能通过这个指针来修改它所指向的数据。
 

int y = 20;
const int* ptr1 = &y; // ptr1 是一个指向整型常量的指针,不能通过 ptr1 修改 y 的值
//*ptr1 = 30; // 编译错误,不能修改通过 ptr1 指向的常量值

const在*之后(等价于在指针和*之间不加空格):表示指针本身是常量,即指针的值(即它所指向的地址)不能被修改,但可以通过这个指针来修改它所指向的数据(如果该数据不是常量)。
 

int z = 30;
int* const ptr2 = &z; // ptr2 是一个常量指针,指向一个整型变量,不能改变 ptr2 的值(即它指向的地址),但可以修改 z 的值
//ptr2 = &y; // 编译错误,不能修改常量指针 ptr2 的值
*ptr2 = 40; // 可以通过 ptr2 修改 z 的值

const在指针类型和变量名之间(通常使用空格分隔):这是为了明确性,虽然从语法上讲,const仍然修饰的是指针所指向的数据,但这样的写法可以使代码更易于阅读。
 

const int* ptr3 = &y; // 和 const int *ptr3 = &y; 是等价的

3. const 在函数参数中

当const用于函数参数时,它表示该参数在函数内部不会被修改。

void foo(const int& param) {
    // 不能修改 param 的值
}

4. const 在函数返回类型中

当const用于函数返回类型时,它表示返回的对象是一个常量。这通常用于返回指向内部数据的指针或引用,以确保这些数据不会被调用者修改。

const int* getPointer() {
    // ...
}

5. const 在成员函数之后

当const出现在类成员函数的参数列表之后时,它表示该函数是一个常量成员函数,即该函数不会修改它所属对象的任何非静态成员变量(除非这些变量被声明为mutable)。

class MyClass {
public:
    int value;

    int getValue() const {
        // 不能修改 value 的值
        return value;
    }
};


总结来说,const在括号前后的位置决定了它是修饰指针本身、指针所指向的数据、函数参数、函数返回类型,还是类成员函数。正确地使用const可以提高代码的可读性和安全性。

在C++中,const 关键字用于声明一个变量为常量,这意味着该变量的值在初始化后不能被修改。当 const 出现在括号后面时,它通常与函数参数、函数返回类型或类成员函数的修饰符一起使用。

1. 函数参数

当 const 用于函数参数时,它表示这个参数在函数内部不会被修改。这可以作为一种向调用者承诺的方式,让他们知道他们的数据不会被意外地更改。

void printValue(const int x) {
    // 不能修改 x 的值
    std::cout << x << std::endl;
}

2. 函数返回类型

当 const 用于函数返回类型时,它表示返回的对象是一个常量。这通常用于返回指向内部数据的指针或引用,以确保这些数据不会被调用者修改。

const int* getPointer() {
    static int value = 42;
    return &value;
}

const int& getReference() {
    static int value = 42;
    return value;
}

3. 类成员函数

在类成员函数中,const 可以有两种不同的用途:常量成员函数:这表示该函数不会修改类的任何成员变量(除非它们是 mutable 的)。
 

class MyClass {
public:
    int value;

    int getValue() const {
        // 不能修改 value 的值
        return value;
    }
};

常量成员函数参数:这表示传递给函数的对象是一个常量对象,因此成员函数不能修改它。
 

class MyClass {
public:
    void printValue(const MyClass& other) const {
        // 不能修改 this->value 或 other.value(如果它是可访问的)
        std::cout << other.value << std::endl;
    }
};


注意,在上面的例子中,printValue 函数有两个 const 修饰符:一个用于指定函数不会修改调用它的对象(即 *this),另一个用于指定传递给函数的参数是一个常量对象。

4. 指针和引用

const 也可以与指针和引用一起使用,以指定指针或引用所指向的对象是常量。

const int* ptr = &someInt; // ptr 是一个指向常量的指针
int* const constPtr = &someInt; // constPtr 是一个常量指针,指向一个整数
const int& ref = someInt; // ref 是一个对常量的引用


在这些例子中,const 的位置决定了它是应用于指针本身还是指针所指向的对象。

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

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

相关文章

C++的入门基础

目录 C的简单介绍命名空间命名空间的使用C的输入与输出缺省参数函数重载 C的简单介绍 本贾尼斯特劳斯特卢普博士在C的基础上增加了面向对象的特性&#xff0c;这时又增加了继承和、类、封装的概念&#xff0c;为后来的面向对象的编程奠定了基础&#xff0c;这被命名为C 命名空…

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

LabVIEW中自定义Ring控件的图标

在LabVIEW中&#xff0c;自定义Ring控件的图标可以让用户界面更加直观和友好。以下是如何在LabVIEW中自定义Ring控件的图标的详细步骤&#xff1a; 步骤1&#xff1a;创建或获取图标 首先&#xff0c;你需要创建或获取你想要在Ring控件中使用的图标。你可以使用图像编辑软件&…

前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)

在实际项目中&#xff0c;有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点&#xff1a; 1. 合理使用reactive和ref reactive&#xff1a;用于将复杂的数据结构&#xff08;如对象或数组&#xff09;转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式&am…

VsCode崩溃无法打开解决办法

今天打开电脑 点开vscode突然不能使用了 每次点开都闪退,于是查找解决办法 直接重启电脑 这个方法没有解决问题 删除软件 重新安装软件 软件删干净之前保存下自己的配置文件 比如扩展和settings.json和keybinding.json Mac系统 在 /Users/用户名/.vscode/extensions 和/User…

jmeter测试工具学习

1.双击jar包打开&#xff0c;发现那个bat打不开 2.新建plan之后编辑添加线程组 会加入500*5次请求 3.添加HTTP请求 添加字段 为了让http请求发送到不同的分片&#xff0c;要把userid随机化 4.添加监听器 5.聚合报告

【大模型搭建】部署Ollama,pull失败,手动构建方案

Ollama 是一个专注于简化大规模机器学习模型开发的框架。它提供了一系列工具来帮助开发者轻松地定义、训练和部署大型语言模型。 优点&#xff1a; • 提供了简洁的API&#xff0c;易于上手。 • 支持多种硬件加速选项&#xff0c;如GPU和TPU。 • 内置了许多预训练模型&#x…

MGRE复习综合实验

R1与R5之间使用ppp的pap认证&#xff0c;R5为主认证方&#xff1a; R1 interface Serial4/0/0ip address 15.0.0.1 8link-protocol pppppp pap local-user huawei password cipher 123456 R5 aaalocal-user huawei password cipher 123456local-user huawei service-type…

java中 使用数组实现需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求实现&#xff1a; 设计一个java类&#xff0c;java方法&#xff0c;根据用户手动输入的绩点&#xff0c;从而获取到绩点最高的成绩。 实现业务逻辑的代码块 import java.util.Scanner;public class PointDemo {/*** 需求&…

中国计量大学理学院访问赛氪网:共探校企合作新篇章来

2024年7月5日&#xff0c;中国计量大学理学院代表团莅临环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff0c;进行了一场深入的调研交流活动。代表团成员包括中国计量大学理学院副院长王义康教授、数据科学系副主任刘学艺副教授以及金世举老师。此次访问旨在进一步强…

wordpress外贸建站公司案例英文模板

Indirect Trade WP外贸网站模板 WordPress Indirect Trade外贸网站模板&#xff0c;建外贸独立站用wordpress模板&#xff0c;快速搭建十分便捷。 衣物清洁wordpress独立站模板 洗衣粉、洗衣液、衣物柔顺剂、干洗剂、衣领净、洗衣皂等衣物清洁wordpress独立站模板。 家具wordpr…

00 Debian字符界面如何支持中文

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian字符界面如何支持中文 《傅老师Debian知识库系列之00》——原创 前言 傅老师Debian知识库特点&#xff1a; 1、拆解Debian实用技能&#xff1b; 2、…

前端视角下的Spring-Boot语法学习:打印 hello-world

今日话题 基于 Spring Boot 打印输出 hello world 作者&#xff1a;云层上的光 时间&#xff1a;2024年6月20日 14时25分14秒 主线任务 一、打印 hello world 1、点击 “新建项目”用来演示 打印输出 “hello world” 2、填写项目配置&#xff1a;&#xff08;详细版见&a…

MYSQL 四、mysql进阶 7(性能分析工具的使用)

一、数据库服务器的优化步骤 数据库调优流程图: 整个流程划分成了 观察&#xff08;Show status&#xff09; 和 行动&#xff08;Action&#xff09; 两个部分。字母 S 的部分代表观察&#xff08;会使 用相应的分析工具&#xff09;&#xff0c;字母 A 代表的部分是行…

利用 Python 解析pcap文件

1、问题背景 当面对处理网络数据包分析时&#xff0c;pcap文件作为一个常见的文件格式存储了网络数据包的详细记录&#xff0c;它常常被用来进行网络故障排查或安全分析。为了充分利用这些数据&#xff0c;我们需要对其进行解析并提取出有价值的信息&#xff0c;例如数据包类型…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…

Angular进阶之九: JS code coverage是如何运作的

环境准备 需要用到的包 node 18.16.0# Javascript 代码编辑"babel/core": "^7.24.7","babel/preset-env": "^7.24.7","babel-loader": "^9.1.3",# 打包时使用的 module&#xff0c; 给代码中注入新的方法# http…

基于51单片机的四路抢答器Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中&#xff0c;51单片机充当了核心控制器的角色&#xff0c;通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作&#xff0c…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例&#xff1a; function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在&#xff0c;直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组&#xff0c;遍历数组每个元素if (Array.isArray(obj)) {obj…

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块&#xff0c;用于处理时间相关的功能 from tqdm import * # 从tqdm包中…