第二章 面向对象的编程风格

2.1 如何撰写函数

函数定义四要素:函数的返回类型、函数的名称、函数的参数列表、函数体

占位符(placeholder) 函数原型(function prototype)

exit() 头文件cstdlib

求某个类型的最小最大值,可查询标准程序库中的numeric_limits class
#include <limits>
cout << numeric_limits<int>::max();

巧用default
switch(pox){
default:
case 2:
cout << "1 ";
case 1:
cout << "1 ";
break;
}
当超过2的时候全部输出1 1

2.2 调用一个函数

传址(by reference)、传值(by value)

void display( const vector<int> &vec)
加上const可以让阅读程序的人了解,我们以传址的方式来传递vector,为的是避免复制操作,而不是为了在函数之中对它进行修改。
等同于 void display( const vector<int> *vec);
比较:
效果相同,传递的都是对象的地址。
用法不同,一个*号,一个&号
pointer可能(也可能不)指向某个实际对象。当我们提领pointer时,一定要先确定其值并非为0,至于reference则必定会代表某个对象,所以不须检查。

生存空间(scope) 生存范围(extent) 局部对象(local object)

内置类型的对象,如果定义在file scope之内,必定被初始化为0,但如果它们被定义于local scope之内,那么除非程序员指定其初值,否则不会被初始化。

heap memory(堆内存) new表达式的另一种形式允许我们指定初值
int *pi; pi = new int(1024); //这不是之前的构造函数语法么
delete pi; 不需要检验pi是否为零,编译器会替我们检查 if(pi != 0) //define NULL 0

2.3 提供默认参数值(Default Parameter Values)

调试时候用

默认参数值从最右边开始进行。
默认值只能指定一次,可以在函数声明处,也可以在定义处。一般放在声明处。

void bubble_sort( vector<int> &vec, ofstream *ofil = 0){    if(!ofil){...} }
bubble_sort(vec);//不会产生调试信息
ofstream ofil( "data.txt" );
bubble_sort(vec, &ofil);//会产生调试信息

void bubble_sort( vector<int> &vec,ostream &ofil=cout)
bubble_sort(vec, ofil);    //调用,不用加取值符

ostream    处理流,基类,写
istream    处理流,基类,读
iostream    处理流,基类,读写

ofstream   处理文件流,子类,写
ifstream    处理文件流,子类,读
fstream    处理文件流,子类,读写

istringstream    从string读取数据
ostringstream    向string写入数据
stringstream    读写string

头文件可为函数带来更高的可见度

2.4 使用局部静态变量(local static objects)

局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在。

static vector< int > elems;
elems.push_back( elems[ix-1]+elems[ix-2] );

vector class 提供有内存自动管理机制,动态内存。

2.5 声明一个 inline 函数

体积小,常被调用
inline函数的定义常常被置于头文件中

类内定义的函数被默认成内联函数。关键字inline 必须与函数定义体放在一起才能使函数成为内联

2.6 提供重载函数(overloaded functions)

返回值、函数名相同,参数列表不同(类型不同,个数不同,顺序不同(string s1, int s2)和(int s2, string s1)(本质还是类型不同))

2.7 定义并使用template functions(模版函数)

将参数列表中指定的所有(或部分)参数的类型信息抽离出来

加入类型为ostream的第三参数,并将其预设参数值为 cout,是更具弹性的一种做法。

template <typename elemType>
void display_message( const string &msg, const vector<elemType> &vec){
    cout << msg;
    for ( int ix = 0; ix < vec.size(); ++ix ){
        elemType t = vec[ ix ];
        cout << t << ‘ ‘;
    }
}

管家次typename(必须写)表示,elemType(任意名称)在display_message()函数中仍是一个临时放置类型的代称。

模版函数的参数列表通常由两类类型构成,一类是明确的类型,另一类是暂缓决定的类型。

//模版再经重载:
template <typename elemType>
void display_message( const string &msg, const vector<elemType> &vec );

template <typename elemType>
void display_message( const string &msg, const list<elemType> &lt );

2.8 函数指针(pointers to functions)带来更大的弹性

必须指明其所指向函数的返回值类型及参数列表。

const vector<int>* (*seq_ptr)( int );

需要重视这个问题!!!!

2.9 设定头文件(header files)

extern 跨文件范围,其他文件也能访问

时间: 2024-10-22 13:36:22

第二章 面向对象的编程风格的相关文章

第8章 面向对象高级编程与网络编程

面向对象的特征 一.多态 程序在运行的过程中,根据传递的参数的不同,执行不同的函数或者操作不同的代码,这种在运行过程中才确定调用的方式成为运行时多态 import abc #多态:同一种事物的多种形态 class Animal: #同一类事物:动物 def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print('say hello') class Dog(Animal): #动物的形态之二:狗 def ta

C Primer plus 第二章复习题及其编程题

1  答: 函数 2  语法错误在C语言中就是写错了程序 比如说int a=5 没有加分号 就是语法错误 3  语义错误就是写的代码没有错 但和自己想实现的是不一样的 比如我们要计算1+1是多少 写成了1-1 就是语义错误 4 这个代码错误百出 如果征求我的意见的话 我会对他说:''兄弟 前途无量啊!! include stdio.hint main(void)(int s;s;=56;print(There are s week in a year .);return 0;) 修改后为 #in

第七章-面向对象高级编程

1 使用__slots__ 1.1 绑定属性和方法 给实例绑定属性 class Student(object): pass >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print(s.name) Michael 给某个实例绑定方法 >>> def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ...

C++服务器开发之基于对象的编程风格

Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/function.hpp> class Thread { public: typedef boost::function<void ()> ThreadFunc; explicit Thread(const ThreadFunc& func); void Start(); void Join();

Java编程思想笔记(第二章)

第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(reference)操作对象 类似遥控器(引用)来操作电视(对象) 在Java中你可以创建一个引用,但是没有与任何对象关联,比如: String s; 这个时候如果用则会报错.安全的做法是: 创建一个引用的同时并进行初始化 String s="1111"; 必须由你创建所有对象 New关键字的意思是给我一

java编程思想 第二章

这篇时间较之前篇章时间靠后,是由于,某一天晚上看完Java编程思想文献之后来不及做笔记了. 以下笔记基本为转载,不是原创 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个“引用”,遥控器(引用)操纵

第二章 【面向对象设计原则】

(一)如何衡量软件设计的质量 内聚度: 表示一个应用程序的单个单元所负责的任务数量和多样性.内聚与单个类或者单个方法单元相关.(好的软件设计应该做到高内聚.) 耦合度: 耦合度表示类之间关系的紧密程度.低耦合是指尽量使用抽象耦合,少用具体耦合. 设计原则名称 设计原则简介 重要性 单一职责原则 的职责要单一,不能将太多的职责放在一个类中. ★★★★☆ 开闭原则 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能.  ★★★★★ 历史替换原则 在软件系统中,一个可

第二章 有什么理由使用Async异步编程

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而为,愿爱技术的园

[原创译书] JS函数式编程 第二章总结

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 函数式程序员的工具集 第二章总结 为了理解函数式编程,这章覆盖了很大范围的主题.首先我们分析了一个编程语言的函数式是什么意思, 并且评估了Javascript函数式编程能力.接下来,我们用Javascript实现了一些函数式编程的核心概念, 并展示了一些Javascript内建的函数式编程函数. 尽管Javascript有一些函数式编程的工具,它函数式编程核心的大部分仍被隐藏着,并