C++类编程(一)const的使用
设计类时,考虑以下五点
1、构造函数初始化列表
2、函数该不该加const
3、参数传递尽量考虑用引用传递,考虑加不加const
4、返回用不用引用
5、数据尽量放在private,函数尽量放在public
一、构造函数
①构造函数参数名不能与类成员名相同
②只有当没有定义能和构造函数时,编译器才提供默认构造函数
③两种定义默认构造函数的形式
1、给已有构造函数的所有参数提供默认值.Stock(const string & co="Error",int n=0,double d=0.0);
2、通过函数重载,定义一个没有参数的构造函数。Stock();
④成员初始化参数列表。
Classy::Classy(int n,int m) : mem1(n),men2(0),men3(n*m+2)
{
//........
}
1、其只能用于构造函数
2、对非静态const数据成员,必须用器来初始化
3、对引用数据成员,必须用器来初始化
4、成员初始化的顺序与其在类声明中出现的顺序相同,与初始化器中的排列顺序无关
⑤析构函数
程序必须有一个析构函数,如果没有,编译器将默认的生成一个析构函数。当在构造函数中使用了new来分配内存时,必须使用delete来释放内存。
二、参数引用
引用变量的主要用途是将引用变量用作形参,使函数可以使用原始数据。引用是已定义变量的别名,与变量指向相同的值和内存单元。单独使用引用变量,在声明引用时必须将其初始化,而不是像指针那样,先声明后赋值。下面程序将看到传递引用时,函数将使用原始数据,改变引用将改变原始数据,与已往的按值传递不同。
#include<iostream> void swapr(int & a,int & b); int main()
{
using namespace std;
int m=,n=; swapr(m,n);
cout << "m " << m << " n " << n << endl; return ;
} void swapr(int & a,int & b)
{
using namespace std;
int temp;
temp=a;
a=b;
b=temp;
cout << "a " << a << " b " << b << endl;
}
结果如下
原始数据和形参的值都发生了交换。
由于改变引用的值,会同时修改原始变量,为了然函数使用传递的信息,而不对这些信息进行修改,同事用像使用引用,则可以使用常量引用,相比于普通变量,const变量属于不可修改的左值。
将引用参数声明为const引用有三个好处:
①使用const引用可以避免无意中修改数据的编程错误;
②使用const引用是函数能够处理const和非const实参,否则只能接受非const实参;
③使用const引用可以使函数能够正确的生成并使用临时变量。
函数参数使用引用、指针和按值传递的选择
对于使用传递的值而不作修改的函数
1、如果数据对象很小,如内置的数据类型或小型结构,则按值传递
2、如果数据对象是数组,则使用指针(唯一选择),并将指针声明为指向const的指针
3、如果数据对象是较大的结构,则使用const指针或const引用,提高效率
4、如果数据对象是类对象,则使用const引用
对于修改函数中数据的函数
1、如果数据对象很小,如内置的数据类型或小型结构,则使用指针
2、如果数据对象是数组,则使用指针(唯一选择)
3、如果数据对象是较大的结构,则使用指针或引用
4、如果数据对象是类对象,则使用引用
三、返回引用
返回引用可以提高效率。返回引用要注意的问题:避免返回函数终止时不存在的内存单元的引用(如在函数中生命的临时变量)。可以返回作为参数传递给函数的引用,也可以使用new分配新的存储空间,但要使用delete删除存储空间。
一般如果函数要返回局部对象的话,应该返回对象,而不是引用,如果函数返回一个没用公有复制构造函数的类的对象,这必须返回对象的引用。如果返回的对象需要修改,则返回非const引用,如果不修改,则返回const引用。
四、函数加const
只要类方法不修改调用对象,就应该将其声明为const。
C++类编程(一)const的使用的更多相关文章
- js中的行为委托和无类编程
概述 <你不知道的JavaScript>中有这么一段话:不幸的是,将类和继承的设计模式思维带入Javascript的想法是你所做的最坏的事情,因为语法可能会让你迷惑不已,让你以为真的有类这 ...
- Python进阶开发之元类编程
系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多 ...
- python3 元类编程的一个例子
[引子] 虽然我们可以通过“class”语句来定义“类”,但是要想更加细粒度的控制“类”的创建,要使用元类编程才能实现. 比如说我们要实现这样的一个约束.所有项目中用到的类都应该要为它定义的方法提供文 ...
- Python元类编程
来源:http://python.jobbole.com/88582/ @property装饰器,是将类中的函数当做属性调用 Python类中定义的属性,如果属性名前面只有一个下划线,那么就是一种规范 ...
- 【c++】类中的const成员
const成员变量 举个例子 #include <iostream> using namespace std; class A { public: A(int size) : SIZE(s ...
- C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别
总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ...
- C++ 类中的const关键字
//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是 ...
- PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)
content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...
- JavaEE-实验一 Java常用工具类编程
该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1. 使用类String类的分割split 将字符串 “Solutions to selected exercises ca ...
- Dart编程实例 - Const 关键字
Dart编程实例 - Const 关键字 void main() { final v1 = 12; const v2 = 13; v2 = 12; } 本文转自:http://codingdict.c ...
随机推荐
- qt添加最小化和关闭按钮
int width = this->width();//获取界面的宽度 //构建最小化.最大化.关闭按钮 QToolButton *minButton = new QToolButton(thi ...
- DOM0,DOM2,DOM3事件,事件基础知识入门
事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM ...
- 关于obj和基本类通过函数参数传进去执行是否改变原来的值
var obj = { p1 : 1, p2 : 2 }; (function(_/* 这个东东是地址的应用哦 */){ _.p1 = 3, _.p2 = 4 })(obj) var i = 2; ( ...
- Java 并发-访问量
有几个常用的措施 1.对常用功能建立缓存模块 .尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能.统计的功能尽量做缓存,或按每天一统计或定时统计相关报表 ...
- C#给文件夹添加权限
//==== //添加权限 private void SetAttributes(string folder) { if (folder == "" || !Directory.E ...
- 全排列(java版)
适用于不同数字的全排列,其实也适用于有重复数字的全排列,只不过的出来的结果有重复,需手动删减掉重复的组合. package testFullPermutation; import java.util. ...
- 轻量级应用开发之(10) UINavigationController导航控制器
一 多控制器 1)一个iOS的app很少只由一个控制器组成,除非这个app极其简单2)当app中有多个控制器的时候,我们就需要对这些控制器进行管理3)有多个view时,可以用一个大的view去管理1个 ...
- LocalDB简介和在VS2012及以上版本的使用
http://www.cnblogs.com/fzrain/p/3812364.html?utm_source=tuicool LocalDB简介和在VS2012及以上版本的使用 之前一不小心把自 ...
- MyEclipse使用SVN进行项目版本控制
一.搭建SVN服务器. 例如,使用VisualSVN Server,下载后安装. (1)在Repositories(版本库)上右击,新建Repository,选择Regular FSFS reposi ...
- WAMP 403 Forbidden禁止访问
WAMP .5修改方法 修改httpd.conf文件 # onlineoffline tag - don't remove Require local To # onlineoffline tag - ...