当前位置: 首页 > article >正文

2025-1-25 c++学习中关于static,初始化列表,友元函数和友元类的问题

1.static

在类中,不仅成员变量可以加static,成员函数也可以加static,成员函数加上static之后只能在函数中访问静态变量,在成员变量private的情况下加上static过后,改成员变量就变为全局的了,在主函数中不能直接访问或者修改,需要在public区写上获取静态成员变量的函数才能访问。加上static后该变量的生命周期就延长了,不会随栈帧的销毁而销毁。

以下代码的作用是计算调用构造函数的次数

#include<iostream>
using namespace std;
class A{
public:
    //普通构造
    A(){n++;}
    //拷贝构造
    A(const A& a){n++;}
    //创建一个函数用以返回n的值
    static int GetN(){//静态函数没有this指针,只能访问类中的静态变量,不能访问非静态的变量
        // _a = 10;不能访问
        return n;
    }

private:
    int _a;
    static int n;//这儿的n存储在静态区中
};

int A::n = 0;

A& f1(A& a){//这儿形式参数用引用就不用访问拷贝构造,返回值用引用也不用访问拷贝构造。
    return a;
}
int main(){
    A a1;
    A a2;
    
    f1(a1);
    f1(a2);
    cout << A::GetN() << endl;  // 输出A类的静态成员变量n的值

    return 0;
}

A& f1(A& a){
return a;
}
//这儿形式参数用引用就不用访问拷贝构造,返回值用引用也不用访问拷贝构造。

在这里插入图片描述
4.非static的成员函数可以调用static的成员函数,也可以调用非static的

2.初始化列表

最好所有的成员变量都用初始化列表来定义,而不是在花括号里面定义,因为自定义变量,const修饰的成员变量,引用的定义不能再花括号中定义,只能使用初始化列表来定义。
成员变量在初始化列表中初始化的顺序是成员变量声明的顺序,不是初始化列表出现的顺序
在这里插入图片描述

3.友元函数和友元类

友元函数就是把要在类外面访问类里面的私有变量的函数在类中
声明一下,前面加上friend。
友元类就是一个类中的成员变量或者成员函数要访问另一个类中的私有成员变量或者成员函数,就可以将该类设置为友元类,就能正常访问。
友元函数不能用const修饰

#include<iostream>
using namespace std;
class Date{
    friend void Modify(Date& d);//友元函数就是把要在类外面访问类里面的私有变量的函数在类中
                                //声明一下,前面加上friend。
public:
    void Print(){
        cout << _year << " " << _month << " " << _day << endl;
    }
private:
    int _year = 0;
    int _month = 1;
    int _day = 1;
};

void Modify(Date& d){
    d._year = 2025;
}

int main(){
    Date d1;
    Modify(d1);
    d1.Print();
    return 0;
}
  • 友元函数不是类的成员函数,而是独立于类的普通函数
  • 友元函数的作用是提供一种方式,让外部函数能够访问类的内部数据,而不必通过成员函数。
  • const修饰符用于成员函数时,表示该成员函数不会修改对象的任何成员变量(除了mutable成员)
class A {
public:
    void print() const {
        // 这里不能修改成员变量
    }
};
  • const修饰符只能用于类的成员函数,因为成员函数可能会修改对象的状态。
  • 非成员函数(包括友元函数)本身不属于任何对象,因此没有“对象状态”可以被const修饰符约束。
  • 友元函数不能用const修饰:因为它没有对象状态的概念,const修饰符对其没有意义。

http://www.kler.cn/a/519321.html

相关文章:

  • The just sharing principle: advice for advice givers
  • Go语言开发项目文件规范
  • 第二十一周:Mask R-CNN
  • 使用 Elasticsearch 导航检索增强生成图表
  • 奇怪的单词(快速扩张200个单词)
  • 深入了解 HTTP 头部中的 Accept-Encoding:gzip、deflate、br、zstd
  • 算法:模拟的巧妙演绎
  • 【MySQL】 表的操作
  • 思科交换机telnet配置案例
  • 第23篇:Python开发进阶:详解测试驱动开发(TDD)
  • ubuntu22.04 系统 A100显卡 深度学习环境配置记录
  • 嵌入式知识点总结 ARM体系与架构 专题提升(二)-ARM处理器
  • Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?
  • 嵌入式C语言:回调函数
  • Java实现经典算法题之模拟双指针用法
  • xss靶场
  • 免费获取Photoshop及其他设计软件的使用权限
  • FastExcel的使用
  • STM32项目分享:智能语音台灯
  • 视频网站服务器为什么需要使用负载均衡?
  • Lsky-Pro在线图片搭建教程(Docker部署方式)
  • 系统思考—动态问题分析
  • AF3 AtomAttentionDecoder类源码解读
  • 【Wordpress网站制作】切换语言的问题
  • 汇编基础语法及其示例
  • kotlin内联函数——runCatching