《C++编程思想》读书笔记

0.前言

说是对本科期间来个总结,不如乘着暑假不忙看两本书,先看着本,主要记录不熟的和不了解的地方。
这里写图片描述

1.正文


第1卷 标准C++导引


第一章 对象导论[0-37](2018.7.2)

这一章主要介绍面向对象思想和项目管理经验(暂时没有感性认识)

第二章 对象的创建与使用[38-56](2018.7.3)

1.extern 关键字
一般声明一个变量的同时就为他分配了空间,即定义该变量,若只是声明一个变量但不定义它,则使用extern关键字

//他表示变量是定义在文件以外的,**或者在本文件的后面部分才定义**
extern int a;

2.字符数组的拼接
c预处理器的一个重要的功能就是可以进行字符数组的拼接,即两个加引号的字符数组邻接,并且他们之间没有标点,编译器就会把这些字符数组连接成单个字符数组。

    char s[100]="sdhuisabdiusa"
                "sdnsoiadnisoa"
                "sdianosidnoiasd";

3.c语言system()函数
其主要用于发出一个DOS命令,简单使用实现一个闪闪发光的屏幕。

#include<iostream>
#include<cstdlib>
#include"random.h"
using namespace std;
int main()
{
    int f=0,l=0;
    char s[20];
    while(1)
    {
        f=getRandomInt(0,9);
        l=getRandomInt('A','F');
        sprintf_s(s,"color %d%c",f,l);
        system(s);
    }

    return 0;
}
第三章 对标准C++导引[57-118](2018.7.4-17)

1.静态变量
(1)static定义函数局部变量时,变量在函数调用第一次时执行,函数调用之间变量的值保持不变,优点在于函数范围之外他是不可用的。
(2)static位于函数名或所有函数外部的变量时,他的意思是“在文件的外部不可以使用这个名字”,即为文件作用域。
2.连接
函数之外定义的所有变量(C++中除了const)和函数定义默认为外部连接,也可以用static强制为内部连接,也可以在定义时使用extern显式指定外部连接。
在c中不必用extern定义变量或函数,但在c++中对于const有时必须使用。
3.C++的显式转换暂时不深究,留在后面

  • static_cast
  • const_cast
  • reinterpret_cast
  • dynamic_cast

    4.sizeof
    sizeof是一个运算符,而非函数,对于一个类型可以使用括号,而对于一个变量,可以去掉括号。

sizeof(int)
sizeof a;

5.结构体的使用
在c语言中使用struct定义结构体后,使用时仍然要加上struct关键字,很麻烦,当然也可以加上typedef关键字来简化,在C++中该部分以及可以丢掉这些,定义结构体后直接使用结构体名。

struct MyStruct
{
    int data;
    MyStruct *next;
};

MyStruct t;

6.字符数组转数值
以前一直使用C++的办法(sstream),将字符串包装成字符流,输出到变量中。C中也提供了相应方法。

    char s1[]="123";
    char s2[]="12345678";
    char s3[]="123.12";

    std::cout<<atoi(s1)<<std::endl;
    std::cout<<atol(s2)<<std::endl;
    std::cout<<atof(s3)<<std::endl;

7.把变量和表达式转换为字符串
标准C具有字符串化运算符“#”,在一个预处理器宏的参数前面加一个#,预处理器会把这个参数转化为一个字符数组,便于调试输出。

    #define LOG(x) std::cout<<#x <<" = "<<x<<std::endl;
    int a=1,b=2;
    LOG(1);
    LOG(a);
    LOG(a+b);
    /*
    1 = 1
    a = 1
    a+b = 3
    */

8.关于调试可以使用”cassert”的assert函数。给他一个参数,如果参数断言为假,则发出错误信息,程序终止。完成调试后,可以在#include<”cassert”>值钱插入语句 #define NDEBUG或者在编译器命令中定义ndebug,用以消除宏产生的代码。”cassert”中使用ndebug用来改变宏产生代码的方式。

    //#define NDEBUG  
    #include<cassert>
    int a=1,b=2;
    assert(a==b);
    /*
    Assertion failed: a==b 并弹出错误框
    vs2012中弹出错误框一般很难定位原因
    每当这个时候就开始怀念使用java 
    */
第四章 数据抽象[119-141](2018.7.4-17)

1.有害的函数声明猜想(C语言)
虽然总是应当通过包含头文件声明函数,但是在C语言中不是基本的。调用没有声明的函数在C中是可以的(C++不行),按照C语言的标准,不强迫这样做,这样编译器会假设。例如,在头文件中声明void f( float )函数,编译器就知道如果用一个整型参数传入,则会自动转换为float,称为提升。然而若未曾声明,则编译器假设有一个f(int)存在,就不做提升了。若此时将int类型数据格式当做float解读,则可能会产生问题。
2.void* 指针
在C中可以将void* 类型赋值给任何指针,而在C++中是不允许的(因为当将void*指针赋给struct时如果不被阻止,就可能会导致对于struct调用逻辑上并不存在的函数)。而C,C++都可以将任何类型的指针赋值给void*,这是void*的最初意图。
3.封装
将数据连同函数捆绑在一起 ,这常常被称为封装。
4.sizeof确定struct/class的长度(暂时不深究,留在后面
一个结构体的大小理论上是他的所有成员大小的和。当然有时候当一个结构体被编译器处理时会增加额外字节来使边界整齐。这里提出一种结构体或者类中无数据成员的情况。

//这样一个无数据成员的类或者说结构体
//其目的在于限定函数名的范围
class Node2
{
    //char a;
    void  f1();
    void  f2();
    void  f3();
};
void Node2::f1()
{
    int a=0;
}
void Node2::f2()
{
    int a=0;
}
void Node2::f3()
{
    int a=0;
}
int main()
{
    std::cout<<sizeof(Node2);
    return 0;
}

//vs2012输出 1
//去掉char a前面的注释,仍然是1
//表明在无数据成员时,编译器总是规定了最小非0长度

关于类的大小问题可参照c++类大小问题
5.结构嵌套
可以将一个结构体或者类嵌套到另外一个结构体或者类中(struct与class在C++中已经区别不大了)

class Stack
{
public:
    class Node
    {
    public:
        void *data;
        Node *next;
        void initialize(void *dat,Node *nex);
    } * head;
    void  initialize();
    void push(void *dat);
};

void Stack::Node::initialize(void *dat,Node *nex)//这里比较有意思。
{
    data=dat;
    next=nex;
}
void Stack::initialize()
{ head=0 ;}

void Stack::push(void *dat)
{
    Node * node = new Node;
    node->initialize(dat,head);
    head=node;
}

6.全局作用域解析
编译器默认选择最接近的名字。作用域解析运算符可以避开这个问题。

int a=5;
void f()
{
    std::cout<<"全局f()"<<std::endl;
}

class s
{
public:
    int a;
    void f();
};

void s::f()
{
    a=100;//局部a
    ::f();//全局f()
    std::cout<<::a<<std::endl;//全局a
}
int main()
{
    s s1;
    s1.f();
    return 0;
}
/*
输出
全局f()
5
*/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值