effective c++学习心得(一)

条款01

这一部分,主要讲了使用c++进行编程,作者讲c++称为语言联邦,可以有几种形式,简单的来说主要分为:

1.类似c++使用**过程式**进行编程。
2.采用了**面向对象**的思想。
3.用于c++中提供了template这个特性,所以就出现了**泛型编程**。
4.另一个则是归功于STL的强大,它对容器,迭代器,算法,函数对象,各自都能很好的配合,性能也很不错。

条款02

在传统的c++语言中,对于定义常量,一般都是使用define关键字来进行定义的,在编译器源程序时,
预编译器会将代码中出现有关用#define定义的常量和函数全部替换。
缺点:

例如:当我们要进行调试程序时,因为编译器已经将原有的常量的符号用一个数值来替代,这时
进行调试时,我们只能看到数字,却不能看到对应的符号,产生了极大的不便。除此之外,当你
想对一个const取地址时,对于define定义的常量时取不了地址的,所以const在这里又发挥
了作用。

利用define语句我们无法创建一个类专属常量,因为一旦一个宏被定义,他将存在于整个编译单元,
或者更大的作用域范围,他并不重视作用域的概念,不能提供很好的封装性。

所以在c++中我们有更好的解决方案,那就是使用const和enum来定义一个常量和一个枚举型数据。对于一个常量型变量编译器会将变量名称记录进符号表中。

注意:在c语言中定义的const常量可以通过指针来改变,但是c++中是不可行,
     c++中不提倡改变常量的值,但是也有方法改变。

    #include <stdio.h>    
    int main(){
            int a = 1;
            const int p = a;
            int *ptr = &p;
            *ptr = 2;
            printf("the p is %d\n", p);
    }

     

关于const的介绍

一.使用const定义变量

int a = 1;
const int *p = &a; //const在*前面,代表指针解引用后的值不可改变
int * const p = &a; // const在* 后面表示指针指向的地址不可改变
const int * const p = &a; // 而这种情况则表示指针指向的地址和解引用的值不可改变

二.在类中使用const关键字

1.常成员变量

class A{
public:
        A():a(1){}  //const声明的成员变量,必须使用初始化列表,来进行初始化
                    // const变量不可更改
        void get();
private:
        const int a;
};

2.常成员函数
常成员函数可以区分函数重载,定义和实现常成员函数都要加const
常成员函数中,不能更新成员变量,不能调用非常成员函数。
2.常成员函数实现

public:
        A(int i, int j):a(i), b(j){}
        void get() const;
private:
        const int a;
        int b;
};

void A::get() const {
        b = 2; //错误,不能更新成员变量
        cout << "the b+1 is " << b+1 << endl; // 这种只是打印数据,不算更新
}

3.常成员函数区分函数重载

#include <iostream>
using namespace std;

class A{
public:
        A(int i, int j):a(i), b(j){}
        void get() const;
        void get();
private:
        const int a;
        int b;
};

void A::get() const {
        cout << "this is a class " << endl;
}

void A::get(){
        cout << "this is a const class " << endl;
}

int main(){

        const A a(1,2);  // 常对象,调用get()的常成员函数版本
        A a1(1,2); // 一般对象,调用普通成员函数
        a.get();
        a1.get();
        return 0;
}

enum

简单介绍一下enum的使用方法:

enum {ONE, TWO};   //直接可以使用ONE,TWO的值

enum W{ONE,TWO}a, b; //通过enum关键字声明a,b两个enum类型的值
a = ONE, b=TWO;  //赋值操作

typedef  enum W{ONE, TWO}w; //使用typedef为enum W 起了个别名w
w w1 = ONE;  //使用w为w1赋值,相当于 enum W w1 = ONE;
w w2 = TWO;

typedef  enum {ONE, TWO}w;  //可以省略点W
w w1 = ONE;
w w2 = TWO;

首先我们先看一下static修饰符的作用:
在类我们使用的是静态变量

#include <iostream>

class Widget{
public:
        Widget(){}
private:
        const static int i; // 这种是正确的
        const static int i = 1; //这种是错误的
                          // 静态类成员变量也称类变量,他不属于单个对象,而是被所有对象共享,
                          //只初始化一次,并且在程序运行期间,内存中只有一份拷贝。还有一点要
                          //特别注意的是,类变量只能在类中声明,在类外定义。
};

const int Widget::i = 1;  // 类外声明类变量

int main(){

        Widget w;
        return 0;
}

这时就引发了一个问题,如果我要在类被实例化成一个对象之间,调用静态常量,由于没有初始化,并没有自己想要的
初值,所以引发了一些不必要的麻烦,此时可以借助enum的帮助

#include <iostream>

class Widget{
public:
        Widget(){}
        void get(){  // 在类中直接实现了函数,编译器会考虑将它变成内联函数。
                std::cout << "the ONE is " << ONE << std::endl;
        }
private:
        enum {ONE = 2};  //定义了一个枚举类型的变量,在类成员函数中可以使用这个常量值
};
int main(){

        Widget w;
        return 0;
}

只是简单介绍了enum的作用,他的功能还有很多,如果想要了解更多,可以自行百度enum。

简单粗略地介绍了条款1 和2,思路比较杂乱,还有比较深层次的东西,由于自己也是刚入门不久的小白,就不献丑了,
哪里有错和需要商榷的,欢迎补充。


Micon
12 声望7 粉丝

enjoy simplicity


引用和评论

0 条评论