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 ...
随机推荐
- Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录
第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...
- Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法
之前在学习@aganqin的Fluent Ribbon项目(http://www.cnblogs.com/aganqin/p/3269384.html).但是一直都有引用了Fluent.dll后仍旧出 ...
- [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...
- UVA5874 Social Holidaying 二分匹配
二分匹配简单题,看懂题意,建图比较重要. #include<stdio.h> #include<string.h> #define maxn 1100 int map[maxn ...
- 001-编译hadoop-2.5.2总结
前两天废了很大的劲来对hadoop-2.5.2进行64位系统的手动编译,由于对linux系统环境以及hadoop本身的不熟悉,编译过程中也出现了很多的问题,在此记录一下,对自己以后再次编译和看到此文章 ...
- NOI题库
07:机器翻译 总时间限制: 1000ms 内存限制: 65536kB 描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个 ...
- PHP 7.1 新特性一览
可空类型主要用于参数类型声明和函数返回值声明.主要的两种形式如下:<?phpfunction answer(): ?int { return null; //ok}function ans ...
- 全栈必备Linux 基础
Linux 几乎无处不在,不论是服务器构建,还是客户端开发,操作系统的基础技能对全栈来说都是必备的.系统的选择Linux发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行 ...
- js中初学函数的使用
<script> function SetColor(name,value) { var oDiv=document.getElementById('div3'); oDiv.style[ ...
- jdbc链接mysql转
完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的 ...