C和C++代码精粹笔记1

CH1 更好的C

  1. 运算符重载规定,必须有一个为用户自定义类型
  2. 一些输出没注意到的函数:

    float x = 123.456, y = 12345;

    //cout.precision(2); //显示两个有效值,其他是科学计数法

    //cout << x << " " << y << endl;

    ?

    //cout.setf(ios::showpoint);//显示末尾的0

    //cout << x << " " << y << endl;

    ?

    cout.setf(ios::showpos);//显示符号

    cout << x << " " << y << endl;

  3. 打印地址

    Printf("%p",s);

    Cout<<"address: "<<&s;

?

CH2 指针

  1. 区别 const的位置

    Const char *p; 说明 *p是常量,不能改变。

    Char* const p; 说明,p是常量,不能改变。

依据看 * 的位置。

  1. 初始化二维指针

    int **a;

    a = new int*[3];//行

    ????for(int i = 0; i < 4; ++i)

    ????{

    ????????a[i] = new int[4];//列

    ????}

    delete[] a;

    ?

    ?

    ????int a[][4] = {{1,2,3},{4,5,6},{7,8,9}};

    ????int (*p)[4] = a;

    ?

    ????//p[i] == *(p+i);

    ????//p[i][j] == *(p[i]+j) == *(*(p+i)+j);

    ?

    ?

    ????size_t totals = sizeof(a);//整个字节数

    ????size_t totalcols = sizeof(a[0]);//整个列字节数

    ????size_t rows = sizeof(a)/sizeof(a[0]);

    ????size_t cols = sizeof(a[0])/sizeof(a[0][0]);

    ????for(int i = 0; i < rows; ++i)

    ????{

    ????????for(int j = 0; j < cols; ++j)

    ????????????cout << p[i][j] << " ";

    ????????cout <<endl;

    ????}

    ????cout << rows << " " << cols << endl;

  2. 函数指针

    指向非成员函数的指针:

    #include <Windows.h>

    #include <iostream>

    ?

    using namespace std;

    ?

    int (*fp)(int,int);//全局指针变量

    void (*farray[])(void); //可以定义在主函数外部,也可以在内部定义。 函数指针数组

    int Max(int a, int b)

    {

    ????if(a > b)

    ????????return a;

    ????else

    ???? return b;

    }

    int main()

    {

    ????fp = Max;

    ????int a = fp(1,2);

    ????cout << a << endl;

    return 0;

    }

    ?

    指向成员函数的指针:

    #include <Windows.h>

    #include <iostream>

    ?

    using namespace std;

    ?

    class C

    {

    public:

    ????void f(){cout << "C::f \n";};

    ????void g(){cout << "C::g \n";};

    ????int Max(int a, int b)

    {

    ????if(a > b)

    ????????return a;

    ????else

    ???? return b;

    }

    };

    ?

    int main()

    {

    C c;

    void (C::*pmf)() = &C::f; //定义指向成员函数的指针

    (c.*pmf)();//指向成员函数的指针,与非成员函数的指针相比,语法上有点小变化,多了 对象.*

    pmf = &C::g;

    (c.*pmf)();

    ?

    int (C::*fp)(int,int) = &C::Max;

    int aa = (c.*fp)(3,4);

    cout << aa << endl;

    return 0;

    }

指向成员函数的指针数组

  1. #include <Windows.h>
  2. #include <iostream>
  3. ?
  4. using
    namespace std;
  5. ?
  6. class Object
  7. {
  8. public:
  9. ???void retreve(){cout << "Object::retreve";}
  10. ???void insert(){cout << "Object::insert";}
  11. ???void update(){cout << "Object::update";}
  12. ???void process(int choice);
  13. private:
  14. ???typedef void(Object::*Omf)();//起别名起的好
  15. ???static Omf farray[3];// 成员函数指针数组
  16. ?
  17. };
  18. Object::Omf Object::farray[3] = {
  19. ??&Object::insert,
  20. ??&Object::retreve,
  21. ??&Object::update
  22. };
  23. void Object::process(int choice)
  24. {
  25. ???if(choice >=0 && choice <=2)
  26. ???{
  27. ??????(this->*farray[choice])();
  28. ??????cout << endl;
  29. ???}
  30. }
  31. int main()
  32. {
  33. ???Object o;
  34. ???for(;;)
  35. ???{
  36. ??????int choice;
  37. ??????cin >> choice;
  38. ??????if(choice >=0 && choice<=2)
  39. ?????????o.process(choice);
  40. ??????else
  41. ??????????break;
  42. ???}
  43. ???return 0;
  44. }
  1. 封装与不完全类型

    采用与源类相似的类实现,就是重新定义一个与源类相似的类,然后重新包装一下。

?

CH3 预处理器

  1. debug模式下可以运行 release下运行不了,用宏定义实现

    #define DEBUG 1

    ?

    int main()

    {

    int i = 2;

    #if DEBUG

    cout << "debugmod" << endl;

    #endif

    return 0;

    }

    ?

    下面这句话也可以实现上面的功能

    ?

#ifdef _DEBUG

cout << "debugmod" << endl;

#endif
// _DEBUG

?

?

要想将新的C++代码与旧的C代码混合编程,需要加下面的语句

extern "C" void f(); //f()在C环境下被编译

  1. 字符集

    回车 \r 换行 \n 回退 \b 警示 \a

    ?

    ?

    ?

CH4 C标准库之一 : 面向合格的程序员

1、<ctype.h>

常见的函数: is系列。Eg : isupper(); islower(); isspcace() 等。

char a = ‘A‘;

int b = isalpha(a);

实例:

  1. #include <Windows.h>
  2. #include <iostream>
  3. #include<ctype.h>
  4. #include <stdlib.h>
  5. #include<stdio.h>
  6. #include <string.h>
  7. using
    namespace std;
  8. ?
  9. long atox(char *s)
  10. {
  11. ???while(isspace(*s))//干掉开头的空格,只要有一个非零的数即跳出
  12. ??????s++;
  13. ???long sum;
  14. ???for(sum = 0L; isxdigit(*s); ++s)
  15. ???{
  16. ??????int digit;
  17. ??????if(isdigit(*s))
  18. ?????????digit = *s - ‘0‘;
  19. ??????else
  20. ?????????digit = toupper(*s) - ‘A‘ + 10;
  21. ??????sum = sum*16L + digit;
  22. ???}
  23. ???return sum;
  24. }
  25. ?
  26. long atox(char*s)
  27. {
  28. ???char xdigs[] = {0123456789ABCDEF};
  29. ???long sum;
  30. ???while(isspace(*s))
  31. ??????s++;
  32. ???for(sum = 0; isxdigit(*s); ++s)
  33. ???{
  34. ??????int digit = strchr(xdigs,toupper(*s)) - xdigs;//找到指针的位置,即数字的位置(0-15取值) 找出字符串xdigs中第一次出现字串 (*s) 的位置。
  35. ??????sum = sum*16L + digit;
  36. ???}
  37. }
  38. long atox(char *s)
  39. {
  40. ???long n = 0;

    1. ???sscanf(s,"%lx",&n); // 参考代码:http://www.91linux.com/html/article/program/cpp/20081130/14121.html
  41. ???return n;
  42. }
  43. int main()
  44. {
  45. ???char* s = "123 abc";
  46. ???//方法一
  47. ???long t = atox(s);
  48. ???//方法二
  49. ???char** ss = NULL;
  50. ???long tt = strtol(s,ss,16);
  51. ???cout << tt << endl;
  52. ???return 0;
  53. }

?

时间: 2024-11-12 02:15:37

C和C++代码精粹笔记1的相关文章

C和C++代码精粹读书笔记

最近看了<<C和C++代码精粹>>, 设计到C++的指针,异常处理等方方面面,其中有些自认为非常不错的代码,在工作中非常值得借鉴. 1.指向成员函数的指针 A #include<iostream> using namespace std; class C { public: void f(){ cout<<"C::f\n";} void g(){cout<<"C::g\n";} }; int main()

javascript语言精粹----笔记【转载】

javascript语言精粹----笔记 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果 4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.

JavaScript语言精粹笔记

JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取其精华去其糟粕.当你知道要做什么的时候,它还能表现的更好,编程时一件相对困难的事情,绝不应该在懵懂的状态下开始编程之旅. JS中的注意为//或者/*content*/,注释一定要精确地描述代码,不然没有用的注释比没有注释更糟糕. JS中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不

JAVA代码规范笔记(下)

声明 17.推荐一行一个声明,因为这样有利于写注释.换句话说,下面的声明方法中, int level; // indentation level int size; // size of table 要优于: int level, size; 绝对不要将变量和方法的声明放在同一行,例如: long dbaddr, getDbaddr(); // WRONG! 不要将不同类型的变量的声明放在同一行,例如: int foo, fooarray[]; //WRONG! 注意:上面的例子中,变量与标识符

《linux 内核完全剖析》 exit.c 代码分析笔记

exit.c 代码分析笔记 release 释放进程的函数release() 主要根据指定进程的任务数据结构指针,在任务数组中删除指定的进程指针,释放相关内存页,并立刻让内核重新调度进程的运行. void release(struct task_struct * p) //释放p指向的进程 { int i; if (!p) //常规检测p是否为0 return; if (p == current) { //不能把自己给释放了 printk("task releasing itself\n\r&q

《linux 内核完全剖析》 fork.c 代码分析笔记

fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录目前最大的pid数值 void verify_area(void * addr,int size) // addr 是虚拟地址 ,size是需要写入的字节大小 { unsigned long start; start = (unsigned long) addr; //把地址强制类型转换之后,赋值给start size += start & 0xfff; //取addr在当前虚拟地址中4

梦断代码阅读笔记有感之二

08梦断代码阅读笔记有感之二 在梦断代码的一开始我们就学会了如何去写代码,如何成功的去做一个软件工程师. 在现在人的严重,也许软件工程师写出的代码只是让人在玩游戏,在用一些简单的用代码写出的软件.只是认为工程师在不断地重复着一个动作:写代码.但我只能说你们大错特错,就像在文章中说的那样,其实软件工程师是在:“改变世界”,他们利用他们的手用键盘在电脑上打出一行一行的代码,程序产生了,一个新的软件也就产生了.而且,众所周知的,工程师做一个软件,总是在无限制的更新他的内容,让我们的软件更加的先进化,就

梦断代码阅读笔记有感之三

09梦断代码阅读笔记之三 这是最后一篇的阅读笔记,我发现时间真的过的好快好快. 想想以前,我们总是在应付一切的差事,但是真正的到最后,我们才发现,到最后吃亏的还是我们自己. 从前的我们,我们总是对自己大脑中的东西一片一片的特别的混乱.其实我们就像作者所说的,我们就像放任胡乱的cd随地的乱放,到最后不知道哪是哪.我们应该学会分类去放置,例如:我们可以根据歌唱者的名字,音乐的类型等等,其实这些东西对于我们写代码也同样的试用,刚开始的上大一时候,我们第一次的学习C++,我们只是随时随地的在写代码,并不

《linux 内核完全剖析》sched.c sched.h 代码分析笔记

sched.c sched.h 代码分析笔记 首先上header file sched.h #ifndef _SCHED_H #define _SCHED_H #define HZ 100 #define NR_TASKS 64 #define TASK_SIZE 0x04000000 #define LIBRARY_SIZE 0x00400000 #if (TASK_SIZE & 0x3fffff) #error "TASK_SIZE must be multiple of 4M&qu