2020/3/19学习笔记

1.共享数据的保护:
如果我们既需要共享数据,又需要保证共享的数据不被修改,保障数据的安全性,这时候我们可以将其定义为常类型,也就是用const修饰的类型。在类的成员函数中,有些函数是不会改变对象状态的,这样的函数我们可以把它定义为常函数,也就是用const修饰的函数。
2.常类型:
常对象:必须定义时进行初始化,不能被更新。前面加const修饰。const 类名 对象名
常成员:用const修饰的类成员:常数据成员和常函数成员。
常引用:被引用的对象不能被更新。const 类型说明符 &引用名;
常数组:数组元素不能被更新(详见第六章)类型说明符 const 数组名[大小]...
常指针:指向常量的指针(详见第六章)
3.常对象:用const修饰的对象

class A
{
public:
    A(int i,int j){x=i;y=j;}
    ...
private:
    int x,y;
};
//...
A const a(3,4);//a是常对象,不能被更新。

4.常成员:用const修饰的对象成员
常成员函数:使用const关键字说明的函数;常成员函数不更新对象的数据成员;
常成员函数说明格式:类型说明符 函数名(参数表) const;
这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。
const关键字可以被用于参与对重载函数的区分。
通过常对象之恩给你调用它的常成员函数。
常数据成员:使用const说明的数据成员。
常成员函数例子:

#include<iostream>
using namespace std;
class R
{
public:
    R(int r1,int r2):r1(r1),r2(r2){}
    void print();
    void print() const;
private:
    int r1,r2;
};
void R::print()
{   
    cout<<r1<<":"<<r2<<endl;
}
void R::print() const
{   
    cout<<r1<<";"<<r2<<endl;
}
int main()
{
    R a(5,4);
    a.print();//调用void print()
    const R b(20,52);
    b.print();//调用void print() const
    return 0;
}

const也是区分不同重载形式的因素之一,之前学过区分不同的重载函数通过不同的参数表,现在const也是区分重载函数的合法因素。
有后缀const编译器会去审查函数体代码有无改变状态的语句,如果有就会报语法错。无const不去做这类检查,不能保证这个函数不改变对象状态。
对象不同于基本数据类型,有很多成员函数可以改变它的状态,编译器控制这一点,便使用常函数。**一个常对象,只能用常函数去处理它,不是常函数,不能通过常对象调用。**而一个普通对象调用常函数也是没有问题的。如果能将一个类里面不打算改变状态的函数主动都声明为常函数,以后定义常对象时使用起来更方便。
常数据成员举例:

#include <iostream>
using namespace std;
class A
{
public:
    A(int i);
    void print();
private:
    const int a;
    static const int b;//静态常数据成员
};
const int A::b=10;
A::A(int i):a(i){}
void A::print()
{
    cout<<a<<":"<<b<<endl;
}
int main()
//建立对象a和b,并以100和0作为初值,分别调用构造函数,
//通过构造函数的初始化列表给对象的常数据成员赋初值
{
    A a1(100),a2(0);
    a1.print();
    a2.print();
    return 0;
}   

常数据成员是不可以放在构造函数体中赋值的,只能通过初始化列表的方法初始化赋值。
5.常引用:在友元函数中用常引用做参数,既能获得较高的执行效率,又能保证实参的安全性。
例子:

#include <iostream>
#include <cmath>

using namespace std;

class Point
{
public://外部接口
    Point(int x=0,int y=0):x(x),y(y){}
    int getX() {return x;}
    int getY() {return y;}
    friend float dist(const Point &p1,const Point &p2);

private:
    int x,y;//私有数据成员
};

float dist(const Point &p1,const Point &p2)
{
    double x=p1.x-p2.x;
    double y=p1.y-p2.y;
    return static_cast<float>(sqrt(x*x+y*y));
}
int main()
{
    const Point myp1(1,1),myp2(4,5);
    cout<<"The distance is:";
    cout<<dist(myp1,myp2)<<endl;
    return 0;
}

这样就能放心地使用友元函数了。

发布了3 篇原创文章 · 获赞 0 · 访问量 9

猜你喜欢

转载自blog.csdn.net/qq_18839043/article/details/104974048