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是指类向外提 ...
随机推荐
- eclipse导入maven时,pom文件的project一直报错(Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.)
这里有两种解决办法. 一:右键项目->maven->update project勾选上Force Update of Snapshots/Releases然后ok就可以了. 二:如果第一种 ...
- CSS动画:animation、transition、transform、translate
https://blog.csdn.net/px01ih8/article/details/80780470 一.区分容易混淆的几个属性和值 先区分一下css中的几个属性:animation(动画). ...
- MySQL----下载安装
MySQL 的官网下载地址:http://www.mysql.com/downloads/ 注意 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持.2. M ...
- day20包
https://www.cnblogs.com/Eva-J/articles/7292109.html 一.模块: 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名 ...
- swagger.net 使用nginx 代理时出现端口号导致出错
1:当我们通过nginx代理访问时,由于nginx配置了映射到的一个站点为端口为127.0.0.1:6201,导致访问swagger接口时出现增加端口号,如下截图,这样就导致整个swagger无法使用 ...
- 用spark-submit启动程序
来源:http://spark.apache.org/docs/latest/submitting-applications.html 提交程序常用的一些选项 ./bin/spark-submit \ ...
- 激活windows专业版(激活windows10专业版,解决“我们无法在此设备上激活windows因为无法连接到你的组织的激活服务器 ”)
本来系统用的好好的,但是前几天系统突然提示我要去取设置里面激活windows,我就想:我的系统好像是原厂正版的吧,怎么就过期了呢?没办法只能搜索下怎么激活,去系统城,各大网站什么的试了好多密钥全部不行 ...
- 局域网IP地址
A类: 10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址). 127.X.X.X是保留地址,用做循环测试用的. B类: 172.16.0.0---172.31.255 ...
- 559. Maximum Depth of N-ary Tree
https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ 非常简单的题目,连edge case 都没有.思路就是:最 ...
- 2018-2019-2 网络对抗技术 20165239Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165239 Exp3 免杀原理与实践 win10 ip地址 192.168.18.1 fenix ip地址为 192.168.18.128 (1)杀软是如何 ...