3-V2-类和对象 -- const内联 静态成员 友元

const修饰成员函数

在成员函数后面加一个const, const修饰this指针指向的对象, 保证调用这个const成员函数的对象在函数内不会被改变
这里写图片描述
注意:成员函数如果不修改成员变量,则加上const,成员函数如果要修改成员变量,此时就不能给其加上const修饰了
1.const对象不能调用非const成员函数,可以调用const成员函数
2.非const对象可以调用非const成员函数和const成员函数
3.const成员函数可以调用其他的const成员函数,但是不能调用其他的非const成员函数
4.非const成员函数内可以调用其他const成员函数和非const成员函数
总结一下,对象在调用成员函数的时候作用域只能缩小,不能增大.

inline内联

用inline关键字修饰的函数 叫做内敛函数,编译器在进行编译的时候,会在调用该函数的地方将该函数进行展开, 没有函数的压栈过程,因此内联函数运行效率较高
1.inline是一种以空间换时间的做法, 省去了调用函数时候的压栈开销, 因此循环递归等不适宜内联函数
2.内联函数只是一个建议,编译会将其自动优化,如果涉及到的函数是递归循环等, 编译器会将内联忽略
3.定义在类内的函数默认为是内联函数

宏的优点以及缺点

宏的优点

增加代码的复用性,提高性能

宏的缺点

宏不方便调试,因为宏的展开是在预处理阶段对其进行展开的
宏的可读性较差,可维护性较差, 如果不注意会导致错误
宏无类型,安全机制较差

友元

友元函数:突破类的封装过程

在c++中友元函数允许在类外访问该雷的所有成员函数,就像成员函数一样, 友元函数只需要在该函数前面加上关键字friend
友元函数可以通过对象访问所有成员,私有和保护也一样

友元类:

有两个类 A 和 B, 其中A类的私有成员之一是B类的一个对象, 此时此时A类就是B类的友元类

class Date
{friend void Show(const Date& d);friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);friend class Time;
public:Date(int year = 1900, int month = 1, int day = 1):_year(year),_month(month),_day(day){cout << "Date(int year = 1900, int month = 1, int day = 1)" << endl;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << "~Date()" << endl;}Date(const Date& d){this -> _year = d._year;this -> _month = d._month;this -> _day = d._day;cout << "Date(const Date& d)" << endl;}Date& operator = (const Date& d){this -> _year = d._year;this -> _month = d._month;this -> _day = d._day;cout << "Date& operator = (const Date& d)" << endl;return *this;}
private:int _year;int _month;int _day;
};class Time
{
public:Time(int year = 1900, int month = 1, int day = 1, int hour = 0, int minute = 0, int second  = 0):_hour(hour),_minute(minute),_second(second){_d._year = year;_d._month = month;_d._day = day;}void Show(){cout << _d._year << "-" << _d._month << "-" << _d._day << endl;cout << _hour << ":" << _minute << ":" << _second << endl;}
private:int _hour;int _minute;int _second;Date _d;
};

注意: 不是任何时候友元都比较好, 我们应该知道友元是对类的封装的一个突破, 所以应在下档的时候使用.

类的静态成员

类里面的成员用static 关键字进行修饰的都叫做静态成员. 其中静态成员是属于这个类的不属于某个对象,即static成员属于这个类的所有对象,不被某个对象所独有
静态成员函数没有隐含的this指针,那么在访问静态成员函数的时候只需要使用了类型::作用域访问符便可以调用该静态成员函数

//代码展示:
class Date
{
public:Date(){sCount++;cout << "Date() " << endl;}void Display(){cout << _year << "-" << _month << "-" << _day << endl;}static void PrintCount(){cout << "Date count:" << sCount << endl;}
private:int _year;int _month;int _day;
private:static int sCount;
};int Date::sCount = 0;void Test()
{Date d1,d2;Date::PrintCount();
}

注意静态成员函数不能访问非静态成员,但是非静态成员函数可以访问静态成员

几个小细节

1.匿名对象(date())存在的生命周期是它所在的那一行, 同时也要注意当我们已经自己写了拷贝构造函数的时候, 此时编译器就不会自动生成构造函数
2.等号两边两个类型不同的时候小类型会转向大类型
3.在写工程时,为什么.cpp和.h分开
(1)方便阅读
(2)封装(开源和闭源)
(3)提高编译速度

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

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

相关文章

C语言 二级指针内存模型混合实战

http://www.cnblogs.com/zhanggaofeng/p/5485833.html //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>//将内存模型①和内存模型②的数据拷贝到内存模型③ char ** threemodel(ch…

扩展欧几里得算法

对于a∗xb∗yca*xb*yca∗xb∗yc,这样一个二元一次方程组&#xff0c;我们想要得到他的一组解可以用扩展欧几里得算法&#xff0c;参数列表的a,b,x,y就是方程中的a,b,x,y&#xff0c;d计算出来是gcd(a,b)。 算法求出来的是a∗xb∗ygcd(a,ba*xb*ygcd(a,ba∗xb∗ygcd(a,b的一组解…

Linux 网络编程八(epoll应用--大并发处理)

http://www.cnblogs.com/zhanggaofeng/p/5901316.html //头文件 pub.h #ifndef _vsucess#define _vsucess#ifdef __cplusplus extern "C" {#endif //服务器创建socket int server_socket(int port);//设置非阻塞 int setnonblock(int st);//接收客户端socket int ser…

约瑟夫问题

n个人编号为0…n-1围成一个圈,从0开始报数,每经过k个人那个人就退出这个圈不再报数,问最后留下来的人的编号. 朴素的做法当然是模拟,但是n,k的值一旦变得比较大的时候就难以解决问题. 我们考虑归纳的解决问题 当只有一个人的时候答案显然为0, 假设我们已知n-1个人的时候答案为…

【数据结构与算法】内部排序之三:堆排序(含完整源码)

转载请注明出处&#xff1a;http://blog.csdn.net/ns_code/article/details/20227303 前言 堆排序、快速排序、归并排序&#xff08;下篇会写这两种排序算法&#xff09;的平均时间复杂度都为O&#xff08;n*logn&#xff09;。要弄清楚堆排序&#xff0c;就要先了解下二叉堆这…

模线性方程(中国剩余定理+扩展中国剩余定理)

已知一系列除数和模数,求最小的满足条件的数 我们先考虑一般的情况&#xff0c;即模数不互质。&#xff08;扩展中国剩余定理&#xff09; 我们考虑两个方程的情况 x%MR xk1∗MRxk1 * MRxk1∗MR x%mr xk2∗mrxk2 * mrxk2∗mr 所以k1∗MRk2∗mrk1 * MRk2 * mrk1∗MRk2∗mr 即…

C++:Vector和List的实现

Vector的实现 //test.h #pragma once#include <iostream> #include <cstdio> #include <string.h> #include <assert.h>using namespace std;typedef int DataType;#define TESTHEADER printf("\n%s\n", __FUNCTION__)class Vector { publi…

【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一&#xff1a; 我们设定s1是入栈的&#xff0c;s2是出栈的。 入队列&#xff0c;直接压到s1即可 出队列&#xff0c;先把s1中的元素倒入到s2中&#xff0c;弹出s2中的栈顶元素&#x…

POJ 1006 Biorhythms

中国剩余定理的模板题 只是有一个问题就是求出来Xk*MR中的R比给定的日期还大&#xff0c;但是如果负数的整除就不是向下取整了&#xff0c;为了解决这个问题&#xff0c;我们将R减小M&#xff0c;这样总是正的&#xff0c;求出来的就没有什么问题。 #include <iostream>…

POJ 3696 欧拉函数+快速幂

题目的意思大概就是问是否存在一串全是8的数字是L的倍数 直接想没有什么想法&#xff0c;要想到用简洁的形式将这个数字表示出来&#xff0c;对于每一位都是8的数字我们可以用 X8*(10k-1)/9的形式表示出来&#xff0c;那么题目的意思就是求X使L|X&#xff0c;我们先处理一下8和…

两个栈实现一个队列,两个队列实现一个栈

http://blog.csdn.net/zw_1510/article/details/51927554 问题1&#xff1a;用两个栈实现一个队列&#xff0c;实现队列的push和delete操作 栈的特性是先进后出&#xff08;FILO&#xff09;,队列的特性是先进先出&#xff08;FIFO&#xff09;,在实现delete时&#xff0c;我们…

C++:String的写时拷贝

String的写时拷贝 //test.h #pragma once#include <iostream> #include <string.h> #include <cstdio> #include <assert.h> using namespace std;#define TESTHEADER printf("\n%s\n", __FUNCTION__) class String { public:String(const …

两个栈实现一个队列与两个队列实现一个栈

http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列&#xff1a; 原理方法&#xff1a;用一个栈为主栈&#xff0c;一个栈为辅助栈存放临时元素。 入队&#xff1a;将元素依次压入主栈 出队&#xff1a;先检测辅助栈是否为空&#xff0c;如果非空&a…

UVa11426——欧拉函数

发现对于gcd问题要多和欧拉函数联系在一起&#xff0c;虽然有时候并不是互质&#xff0c;但是我们知道有多少互质的然后根据互质的数目就能解决很多个gcd的问题 对于这道题目&#xff0c;题目要求的是所有数对的gcd的和&#xff0c;直接思考的话有难度。但是我们如果联想到欧拉…

C++:继承和多态

虚函数:只有类的成员函数才能定义为虚函数 虚函数 在类的成员函数前面加上一个 virtual 关键字, 此时这个成员函数就叫做虚函数 虚函数 当在子类中定义了一个与父类完全相同的虚函数的时候,此时就叫做子类的虚函数重写了父类的虚函数 构成多态的条件 派生类重写基类的虚函数…

POJ 1061扩展欧几里得

扩展欧几里得的模板题&#xff0c;需要注意的是为了得到一个最小正数解我们要使axbyc中的a,b都是正数 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<cmath> #include<ctim…

C++::探索对象模型

前面我们已经知道, 在没有虚函数的时候, 对象的大小就是对应的成员变量的大小, 而成员函数不会占用对象的空间, 今天我们来讨论一下, 当类中定义了虚函数的时候, 此时对象的大小以及对象模型 非继承下的对象模型 class Base { public:virtual void func1(){cout << &qu…

auto_ptr

#include <iostream> #include <memory> using namespace std;class A { public:A(){cout<<"构造"<<endl;}~A(){cout<<"A析构"<<endl;}void fun(){cout<<"A::fun"<<endl;} };class PA { public…

POJ 2142——扩展欧几里得

题目是很裸的扩展欧几里得&#xff0c;但是对x,y有限制条件&#xff0c;要求所有x,y中abs(x)abs(y)最小&#xff0c;在这个条件下要求abs(a* x)abs(b* y)最小 显然我们需要用扩展欧几里得求得一组解&#xff0c;问题在于如何处理这组解以得到符合条件的值。 我是这样处理的&a…

C++::模板

模板的简单介绍 C中模板是为了能够使得函数或者类实现范型编程的目的, 同时C模板的出现是为了避免代码的冗余 举个例子 void Swap(int& a, int& b) {int tmp a;b a;a b; } void Swap(char& a, char& b) {char tmp a;b a;a b; } 上面的函数除了类型不…