Thinking in C++【1】对象的创建与使用

1.早捆绑(early binding)与晚捆绑(late binding)

  • 早捆绑:编译器会对特定的函数名产生调用,而连接器将这个调用解析为要执行代码的绝对地址。在OOP中,直到程序运行时,编译器才能确定执行代码的地址。

2.vitual关键字

  • vitual关键字表明它希望某个函数有晚捆绑的灵活性(并不需要懂得virtual使用的机制,但是没有它,我们就不能用C++进行面向对象的程序设计)。
  • 默认成员函数不能动态捆绑,故需添加virtual关键字

3.创建和销毁对象

  • :C++把效率控制作为最重要的问题,为了最大化运行速度,通过将对象存放在(栈是内存中的一个区域,可以直接由微处理器存放数据)中或静态存储区域(内存固定块)中,存储和生命期可以在编写程序时确定。但这牺牲了灵活性。
  • :区域动态创建对象。new关键字在堆上生成,delete关键字在堆上释放。因为堆是在运行时动态管理,所以在堆上分配内存比在栈上创建存储的时间长得多(在栈上创建存储常常只是一条向下移动栈指针的微处理器指令,另外一条是移回指令)。
  • 生命周期对比:在栈或静态存储上创建一个对象,编译器决定这个对象持续多长时间并能自动销毁它;在堆上创建对象,编译器则不知道它的生命周期

4.C++对C的改进

在C++中,程序员必须先声明函数,使编译器能检查它们的使用。预处理器也限制了值替换和宏,减少了查找错误的困难。


5.解释器与编译器

  • 解释器将源代码转化成一些动作(它可由多组机器指令组成)并立即执行这些动作。
  • 编译器直接把源代码转化成汇编语言或机器指令。为了提高编译速度,一些编译器采用了内存中编译。大多数编译器,编译时每一步都要读写文件。内存中编译器就是将编译器程序存放在RAM中。

6.声明与定义:

  • external关键字:表示变量是在文件以外定义的,或在文件后面部分才定义
//Declaration & definition examples
extern int i ; // Declaration without definition
extern float f(float); // Function declaration
float b; // Declaration & definition
flaot f(float a) {
    
     // Definition
 	return a + 1.0;
}

int i; // Definition
int h(int x) {
    
     // Declaration & definition
	return x + 1}

7.标准C++ include语句格式

  • 去掉.h:#include <iostream.h> 可写为 ** #include< iostream>**
  • 在文件名前加字母c:#include <stdio.h> 可写为 ** #include< cstdio>**
  • 过去的 #include <iostream.h> 相当于
    #include < iostream> using namespace std;

8.字符数组的拼接

C预处理器的一个重要功能是可以进行字符数组的拼接。如果两个加引号的字符数组邻接,并且它们直接没有标点,编译器就会把这些字符数组连接成单个字符数组。

cout >> "This is far too long to" 
        “single line but it can broken up with”
        "arrays.\n"

补充

  • 字符串string类是设计来处理(并隐藏)对字符数组的初级操作
  • 字符串的Initialization:1) string s1 = “Hello”; 2) string s2(“I am”);
  • string具有动态性,不必担心string的内存分配

9.文件的读写:fstream & getline

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, const char * argv[]) {
    
    
    ifstream in("test.cpp");  //Create a reading file object, and open it for reading
    ofstream out("test2.cpp"); //Create a writing file object, and open it for writing
    string s;
    //getline(ifstream, stream)把一行读入到string对象中(以换行符结束)
    while (getline(in, s)) {
    
    
        //getline()并不读换行符\n
        out << s << "\n"; // ..must add it back
    }
}

注释: while(in >> word) // 每次取1个单词

10.vector类

  • vector类是一个模板,可用于不同的类型。若定制只装string对象的vertor,则使用vector
  • 添加新元素:1) push_back():向容器尾部添加元素;2) push_front:向容器头部添加元素
  • 获取元素:向数组一样使用(vector[i]) 【容器的长度:vector.size()】
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//使用vector容器存储并输出数据
int main(int argc, const char * argv[]) {
    
    
    vector<int> v;
    for(int i = 0; i < 10; i++)
        v.push_back(i);
    for(int i = 0; i < v.size(); i++)
        cout << v[i] << ",";
    cout << "\n" << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/112203966
今日推荐