C++之几个最常
1.同类对象间的数据共享——静态成员
静态数据成员
声明静态数据成员要采用关键字static;
类静态数据成员的定义和初始化
定义:static 数据类型 成员名;
初始化:数据类型 类名::静态数据成员名=初始值;
注意静态数据成员必须在文件作用域的某个地方用类名限定符对静态数据成员定义并初始化。
class Student
{
private:
int num;
char name[];
public:
static int count;//用于计数的静态变量(这里就是用来计数学生的个数的)
Student(){count++;}
Student(char*,int _num=0);
~Student(){count--;}
};
int Student::count=0;//在类外用类名限定符初始化;
访问这个静态数据成员的方式:
Student::count;或 Student stu[2]; stu[0].count==stu[1].count;
同全局变量相比,使用静态数据成员的优势。
(1)静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
(2)可以实现信息的隐藏,保证了信息的安全性。
总结:对于静态数据成员,在程序中只能提供一个定义,这就意味着静态成员不应该被放在头文件中,
或者是包含inline函数定义的文件中。由于静态成员在类中只有一份定义,在其对象中没有拷贝,因此
静态成员不依托于类对象的存在而存在。因此在没有实体对象的时候,我们访问静态数据成员的时候需
要通过域操作符::来访问。
静态函数成员
静态函数的声明在类中也用关键字static声明。
在上面的成员函数里加上static int GetCount(){return count;}
访问方式:Student::GetCount();
静态函数成员的目的:如果上面那个静态变量不是公有的,那么就不能直接Student::count;这样访问
了,这是不允许的,所以需要留出一个访问出口来访问这个静态变量。
注:静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态数据成员必须通过参数传递
方式得到对象名,然后通过对象名访问。
总结:静态成员函数和静态成员数据一样,在类对象中只有一份拷贝,对静态函数的调用可以通过类对
象实例,如stu[0].GetCount()。或者像上面那种方式。一般来说,静态成员函数主要用于对静态数据
成员进行维护雨数据共享。
2.常引用
常引用简单来说就是在引用时加一个const修饰符,保证引用访问时不更改该对象。
例如:void Compare(const int& x,const int& y);
常引用一般出现在函数参数表内,用以在函数调用对象的时候保证对象的数据不被更改。一旦更改择会
报错。
例如:
void Compare(const int& x,const int& y);
{
if(x==y)->if(x=y);//有赋值发生x的值改变了,则会报错。
}
3.常成员
类中有时候需要用到某些常量,这些常量如果定义为全局常量,这样的类显然不适合代码移植,所以在
类中定义为类的常成员,就可以很方便的移植了。
class Circlecal
{
private:
double Radius;
const double PI;//常量的定义
public:
Circlecal(double r=0):PI(3.1415)//常量的初始化
{
Radius=r;
}
}
上述是求圆的面积的简洁类定义,PI就是那个常量。
注意常量的初始化只能在初始化列表中给出。
如果像上述则PI在每一个对象都有一份拷贝,造成了数据的冗长,静态常成员数据可以解决这个问题。
如static const double PI;其初始化与静态成员初始化相同,需要在非头文件中初始化。
常成员函数
在普通的函数后面加上const就是一个常成员函数了;
class Circlecal
{
private:
double Radius;
const double PI;//常量的定义
public:
Circlecal(double r=0):PI(3.1415)//常量的初始化
{
Radius=r;
}
double DetR()const;//声明常函数,用于返回圆的半径
}
double Circlecal::GetR()const//定义常函数的时候不可将const省去
{
Radius=3;//错误!不可以改变Radius的值
return Radius;
}
总结:常成员函数不能更新对象的数据成员,也不能够调用任何非常成员函数虽然如此,如果该类中含
有指针,那么在常成员函数中就能修改指针指向的对象,而编译器不会检查到这种错误。
4.常对象
常对象就是对象在生存期内不可更改的对象。
#include <iostream>
#include <cmath>
#include<iomanip>
using namespace std;
class CircleCal
{
private:
double Radius; //定义半径
static const double PI;//静态常成员数据的定义
public:
CircleCal(){};
CircleCal(double);
double Cal(); //声明计算面积函数
double GetR() const;
double GetR();
~CircleCal(){};
};
const double CircleCal::PI=3.1415;//静态常成员数据的初始化
CircleCal::CircleCal(double r):Radius(r){};
double CircleCal::Cal()
{
return pow(Radius,2)*PI;
}
double CircleCal::GetR() const
{
cout<<"const function is loaded"<<endl;
return Radius;
}
double CircleCal::GetR()
{
cout<<"normal function is loaded"<<endl;
return Radius;
}
int main()
{
const CircleCal R1(2.5); //定义CircleCal的常对象R1
// const CircleCal R2; //错误!R2必须被初始化
// cout<<setw(4)<<R1.Cal()<<endl; //错误!R1不能调用非const成员函数
cout<<"the Radius of R is: "
<<setw(4)<<R1.GetR()<<endl;
}
常对象首先需要被初始化,然后使用,在使用过程中,常对象只能调用常成员函数,因为一切调用非常
成员函数都被视为是危险的,即便这个非常成员函数并没有修改成员数据。一般来说,如果需要有常对
象的访问,编写常函数是很重要的。
5.常指针与指针常量
常指针格式:
const 数据类型 *指针名
如const int *p
常指针即:不能通过该指针的间接引用改变所指向的值;但是指针所指变量本身可以改变,指针变量也
可以被不同地址赋值。
指针常量格式:
数据类型 *const 指针名=初始地址
如int *const p=&a
这种指针定义时候就被初始化,以后所存地址都不能改变,但是可以通过间接引用改变所指变量的值
注意:是字符串常量存放在内存中,有自己的固定首地址,也就是说如果把字符串常量的首地址看成是
指针的话,那么该指针既是常指针(值不变)又是指针常量(首地址固定)
另外字符串常量可以又数组或者字符指针方式表示:
用数组表示:
char str_array[]="china";//数组名是指针常量
char *str_ptr="china";//字符指针是常指针
C++之几个最常的更多相关文章
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- C++常考面试题汇总
c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...
- OCP考点实战演练02-日常维护篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练02-日常维护篇 1.数据库体系结构和AS ...
- c/c++常见面试题
1. C中static有什么作用 (1)隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命 ...
- C++点滴----关于类常成员函数
关于C++中,类的常成员函数 声明样式为: 返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...
- Node.js开发者最常范的10个错误
目录 前言 1 不使用开发工具 1.1 自动重启工具 1.2 浏览器自动刷新工具 2 阻塞event loop 3 频繁调用回调函数 4 圣诞树结构的回调(回调的地狱) 5 创建一个大而完整的应用程序 ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- Windows XP系统下添加任务计划常出现问题解决办法
Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击 ...
- [Linux]在linux中,常常用到ctrl和其他按键组合,常用的有哪些及意义呢
在linux中,常常用到ctrl和其他按键组合,常用的有哪些及意义呢? Ctrl+c 结束正在运行的程序 Ctrl+d 结束输入或退出shell Ctrl+s 暂停屏幕输出[锁住终端] Ctrl+q ...
- ASP.NET常见面试题及答案(130题)
1.C#中 property 与 attribute(抽像类)的区别,他们各有什么用处,这种机制的好处在哪里?答:property和attribute汉语都称之为属性.不过property是指类向外提 ...
随机推荐
- 初学python之路-day12
本篇补上字符串的比较:按照从左往右比较每一个字符,通过字符对应的ascii进行比较 一.函数默认值的细节 # 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值 a ...
- Java数据类型与运算符
Java 基本数据类型 Java 的两大数据类型: 内置数据类型 引用数据类型 内置数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. b ...
- C# 操作docx文档
一.需要引用DocX类库文件,可以直接在NuGet中找到. 二.创建文件,并添加一张表格 public static string fileName = AppDomain.CurrentDomain ...
- CocosCreator检测动作执行完毕的方法~之一吧,应该= =
解决方案是利用动作序列,在动作后面跟一个回调函数,然后再利用之前设置好的动作执行完毕标志,即可完成动作结束的判断!Bingo!
- Metaphor of quotient space
In James Munkres "Topology" Section 22, the quotient space is defined as below. Definition ...
- 16 道嵌入式C语言面试题
1. 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到 ...
- Java - 数组排序 -- 浅析稳定性与复杂度
上次我们了解了对数组的基本操作,那么谈到数组,我们就不得不谈谈数组的排序 什么是排序 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列 -- 百度百科 排序是 ...
- Quartz+JAVA+Servlet实现任务调度系统(简洁)
前言 该系统使用场景: 在12306上买了一张火车票,30分钟内需要支付(需要添加一个倒计时),30分钟还没有支付就请求取消订单的接口(自动根据url请求),如果支付了收到了支付的回调通知后,就删除计 ...
- 做IT,必备的安全知识!
以前的认知 以前刚接触IT行业,而我身为运维,我以为我所需要做的安全就是修改服务器密码为复杂的,ssh端口改为非22,还有就是不让人登录服务器就可以保证我维护的东西安全. 现在的认知 工作也好几年了, ...
- centos6.5中 linux 升级内核
需要使用安装docker ,但是docker 需要版本在3.1及以上.但是虚拟机的是2.6所以需要升级 记录以下升级的时候报错以及解决的办法 遇到的错误有: 1.出现curl: (35) SSL co ...