zoukankan      html  css  js  c++  java
  • C++:类与类中的函数

    C++特性的C实现

    C++ 在 C with class 时期,C++ 的实现是先将 C++ 程序翻译为 C 程序,然后使用 C 编译器进行编译
    从其中我们可以窥见一些细节

    甚至可以用 C 提供的基本特性来实现面向对象特性 例子


    this 指针

    在这里插入图片描述
    this 指针就是下面 C 函数中的指针 C,即 this 指针指向的就是调用该成员函数的对象
    this 是一个指针常量 (const of pointer),类型声明为 class * const this

    然而 对于以下代码

    class type{
    	void print(){ std::cout << "hello world"; }
    };
    
    type *t = NULL;
    t->print();
    

    仍然可以正确执行,因为在该成员函数中,并没有实际访问 this 指针指向的对象


    静态成员

    静态成员变量

    使用 static 修饰的成员变量为静态成员变量,该变量属于类而非某个具体对象
    sizeof 运算符计算对象大小时,不会包括静态成员变量

    静态成员变量实际上就是类空间内可见的全局变量
    类中的静态成员变量只能通过声明为全局变量来初始化

    静态成员函数

    使用 static 关键字修饰成员函数,表明该成员函数是属于类的,并不作用与某个对象
    因此静态成员函数中没有 this 指针,也不可访问非静态成员

    静态函数实际上就是类空间内可见的全局函数
    设置静态成员函数的目的是将一些相关性强的全局函数收纳到一个类中

    class Car {
    	public:
    	static int sv = 0;
    	static int getStaticVar(){ return sv; }
    };
    
    //三种访问静态成员函数的方式
    Car c;
    c.getPrice();
    ((Car *)NULL)->getPrice();  Java中 ((ClassName)null).classStaticMethod();  与此类似
    Car::getStaticVar();
    

    类的所有对象共享类的静态成员


    常量成员

    常量成员变量

    const修饰的成员变量为常量

    常量成员函数

    在函数声明/定义语句的参数列表后使用 const 修饰符,表明成员函数为常量成员函数
    在函数名前添加的 const 修饰的是返回值类型

    常量成员函数中的 this 指向的对象是常量,即 this 的类型为 const class * const this

    为保证安全,类的常量对象只可以调用常量成员函数,因为普通成员函数中可能对对象进行修改
    而非常量对象也可以调用常量成员函数,因为由 指针常量 到 指向常量的指针常量 一定是安全的

    常量成员函数与同名参数表也相同的非 const 成员函数以重载关系共存

    此外,当成员变量使用 mutable 关键字修饰时,在常量成员函数中,就仍然可以改变
    可以想到,mutable 关键字和 const 是冲突的,不可同时修饰一个变量


    友元

    友元分为 友元函数 和 友元类 两种

    友元函数

    在函数的声明语句前加上 friend 关键字,表明该函数为友元函数
    可以将一个类的成员函数声明为友元,包括构造函数、析构函数

    友元函数可以访问这个类的私有成员

    当一个函数与某个类关系密切时,可以使用友元函数

    class Saleman{
    	modifyPrice(Item * itp, int newPrice){ itp->price = newPrice; }
    };
    
    class Item{
    private:
    	int price;	
    	friend Saleman::modifyPrice(Item *itp, int newPrice);//声明为友元函数
    	friend getMostExpensive(Item[] its, int size);//声明为友元函数
    };
    
    int getMostExpensive(Item[] its, int size){
    	int p = 0, index = 0;
    	for(int i = 0;i<size;i++){
    		if(its[i].price > p){
    			p = its[i].price; 
    			index = i;
    		}
    	}
    	return index;
    }
    
    友元类

    如果 class B 是 class A 的友元,则 class B 的成员函数可以访问 class A 的私有成员

    class B{};
    class A{
    	friend class B;
    };
    

    友元关系不是双向的
    友元类间的关系不传递,不进行继承


    2020/1/19

  • 相关阅读:
    SQL查询
    redis 命令行常用命令
    linux ss ip
    jdk下载地址
    requests.session保持会话
    Python通过重写sys.stdout将控制台日志重定向到文件
    解决Python3 控制台输出InsecureRequestWarning问题
    uniapp实现iframe效果
    模拟登录 react 的页面
    vueX的五大属性和使用方法包括辅助函数
  • 原文地址:https://www.cnblogs.com/kafm/p/12721782.html
Copyright © 2011-2022 走看看