[类和对象]4 C++ static & friend
1.静态成员变量和成员函数
思考:每个变量,拥有属性。有没有一些属性,归所有对象拥有?
1.1 静态成员变量
1)定义静态成员变量
关键字 static 可以用于说明一个类的成员
静态成员提供了一个同类对象的共享机制
把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个static 成员
静态成员局部于类,它不是对象成员

1.2 静态成员函数
#include <iostream>
using namespace std; class BB {
public: //
BB() { } //无参构造函数
BB (int a) { Pub_mem = a; } //有参构造函数 //普通成员函数
void printC() {
cout<<"c:"<<Pri_Static_mem<<endl;
}
void AddC() {
Pri_Static_mem = Pri_Static_mem + ;
} public:
static void getC() { //静态成员函数
cout<<"静态成员函数 c:"<< Pri_Static_mem <<endl;
/**
* 静态函数中 不能使用 普通和静态(私有/公有)成员变量
* 静态函数中 不能使用 普通和静态(公有)成员函数, 但可以使用 静态(私有)成员函数
*/
// cout<<"a:"<<a<<endl; //error C2597: 对非静态成员“BB::a”的非法引用
// cout<<"mem:"<<Pub_mem<<endl; //error C2597: 对非静态成员“BB::Pub_mem”的非法引用
// printC();//error: cannot call member function ‘void BB::printC()’ without object
Private_Static_func();
} private:
static void Private_Static_func(){
//
} public:
int Pub_mem; //公有数据成员
static int Pub_Static_mem; //公有静态数据成员 private:
int a; //私有数据成员
int b; //私有数据成员
static int Pri_Static_mem; //私有静态成员变量
protected:
}; /* 如果使用了静态变量:一定要注意初始化!!!! */
int BB::Pri_Static_mem = ; //声明与定义 静态数据成员变量 初始值为10 [私有]
int BB::Pub_Static_mem = ; //声明与定义 静态数据成员变量 初始值为1 [公有] int main(void) {
/*--------------------------------------------------------------
私有静态数据变量:只能调用函数进行访问
--------------------------------------------------------------*/
BB b1, b2, b3;
b1.printC(); //
b2.AddC(); //
b3.printC(); //11 //私有/公有静态成员变量/函数的调用方法 对象. 类::
b3.getC();
BB::getC(); cout<<"hello..."<<endl; /*--------------------------------------------------------------
公有静态数据变量: 可以直接调用该变量进行修改
--------------------------------------------------------------*/
BB cs(); //mem = 7 初始化 for(int i = ; i < ; i++) {
BB::Pub_Static_mem += i ;
cout << BB::Pub_Static_mem << '\t' ;
}
cout<<endl; return ;
}
c:10
c:11
静态成员函数 c:11
静态成员函数 c:11
hello...
1 2 4 7 11
2.友元函数和友元类
2.1 友元函数
?为什么设计友元类和友元函数?
C++中的类对成员函数和变量进行了封装,但同样为编程人员提供了一个破坏该封装的操作,
方便程序员对类的私有成员和函数进行访问
重点掌握友元函数即可!
2.2 友元类
#include <iostream>
using namespace std; class A
{
public:
//友元类B
friend class B; //1 声明的位置 和 public private没有关系
//2 函数modifyA 是 类A的好朋友
friend void modifyA(A *pA, int _a); A(int a=, int b=)
{
this->a = a;
this->b = b;
}
int getA()
{
return this->a;
} private:
int a;
int b;
}; void modifyA(A *pA, int _a)
{
pA->a = _a;
} //若B类是A类的友员类,则
// 在B类的所有成员函数都是A类的友员函数
// 在B中可以访问A类的私有成员 私有函数
//友员类通常设计为一种对数据操作或类之间传递消息的辅助类
class B
{
public:
void Set(int a)
{
Aobject.a = a;
}
void printB()
{
cout<<Aobject.a <<endl;
}
private:
A Aobject;
}; int main(void)
{
/* 友元函数 */
A a1(, );
cout<< a1.getA()<<endl;
modifyA(&a1, );
cout<< a1.getA()<<endl; /* 友元类 */
B b1;
b1.Set();
b1.printB(); cout<<"hello..."<<endl;
return ;
}
1
300
700
hello...
[类和对象]4 C++ static & friend的更多相关文章
- Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final
笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...
- Java学习笔记(二)——类和对象
[1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...
- php笔记(二)PHP类和对象之Static静态关键字
PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...
- 【很变态】PHP类实例化对象竟然可以访问类的“静态(static)方法”!!!
之前发现一个PHP的变态问题:PHP中静态(static)调用非静态方法详解 这次看了下 ThinkPHP 的源码 function.inc.php ,里面有个函数: /** * 取得对象实例 支持调 ...
- Java第7次作业:造人类(用private封装,用static关键字自己造重载输出方法)什么是面向对象程序设计?什么是类和对象?什么是无参有参构造方法 ?什么是封装?
什么是面向对象程序设计? 我们称为OOP(Object Oriented Programming) 就是非结构化的程序设计 要使用类和对象的方法来进行编程 什么是类,什么是对象 类就是封装了属性和 ...
- 0604-面向对象、类与对象、类、static、构造方法/析构方法
一.面向对象 1.面向过程:一个人分步骤完成某个事情 2.面向对象:某件事情拆分为多个任务,由每个对象独立完成,最后调用整合为一个完整的项目 3.三要素:继承.封装.多态. 封装:私有化属性 提供公共 ...
- java学习-初级入门-面向对象⑥-类与对象-静态static
这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...
- 前端学PHP之面向对象系列第一篇——类和对象
× 目录 [1]类 [2]成员属性[3]成员方法[4]对象[5]成员访问[6]this 前面的话 面向对象程序设计(OOP)是一种计算机编程架构.计算机程序由单个能够起到子程序作用的单元或对象组成,为 ...
随机推荐
- 裁剪插件jCrop
为大家介绍个插件:jCrop.这个插件被我用在了多个项目中,如通过画热力图来查看某块地方用户的浏览数,放大缩小拖动选框来实时预览所选区域的图片病裁剪,设置头像是选框必须要是正方形,它有着丰富的配置参数 ...
- 【Java-Method】读《重构》有感_Java方法到底是传值调用还是传引用调用(传钥匙调用)
今天读<重构>P279, Separate Query from Modifier,将查询函数和修改函数分离. 问题的产生 突然想到 Java 的传对象作为参数的方法到底是 传引用调用,还 ...
- Linux添加新硬盘,设置分区和开机自动挂载之图文教程!
虚拟机添加硬盘的步骤就不多废话了,主要列出添加硬盘后要进行设置的几个详细步骤: 1.查看磁盘信息:fdisk -ls 添加前如下图所示: 添加后如下图: 也可以用:ls /dev/sd*查看,如下图: ...
- iOS网络图片缓存详解
在开发移动应用的时候比如Android,IOS,因为手机流量.网速.内存等这些因素,当我们的移动应用是针对互联网,并要频繁访问网络的话,对网络优化这块就显得尤为重要了. 比如某个应用要经常显示网络图片 ...
- react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路
在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes ...
- 实战 Lucene2.0
Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家 ...
- AWS CentOS7 实例修改主机名
问题描述: AWS EC2 实例在升级到CentOS7以后,我们发现主机名的修改不再像之前的版本(CentOS 5/6)一样简单. 每次新建实例之后,修改好主机名,重启或者克隆之后的机器,主机名还是会 ...
- Mysql入门基础命令
1 Mysql基本操作 1.1 查询当前数据库 mysql> show databases; +--------------------+ | Database | +------- ...
- Java执行存储过程
1.JDBC调用存储过程: CallableStatement /** *p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替 *其余地方写法固定 */ CallableStateme ...
- 彻底弄懂session,cookie,token
session,cookie和token究竟是什么 简述 我在写之前看了很多篇session,cookie的文章,有的人说先有了cookie,后有了session.也有人说先有session,后有co ...