C++学习点滴1

基于《c++ primier》第三版

 

1. 基于对象--> 封装
   面向对象--> 继承、多态

2. 算法的概念不要局限于某些数学算法(排序、遗传算法之类的),只要是对带求解问题的解决步骤的描述,都可以称为算法。

3. c++最小的程序单元式语句(statement):
    声明语句(declaration): 如int i = 0;
    赋值语句(assignment):如i=100;
    输入/输出语句:如cout<<"hello world";

4.函数=函数原型+函数体
  函数原型=返回类型+函数名+参数列表

5. C++从main()函数开始执行。
  标准C++中,如果main函数没有return语句,则缺省返回0,表示OK。

6. include <xxx.h> // 标准头文件,从预定义目录搜索
   include "xxx.h" // 用户提供的头文件,从当前目录开始搜索

7. 头文件一般如下定义:
   #ifndef XXX_H
   #define XXX_H
   // 。。。
   #endif

8. 几个预定义常量:
   __cplusplus 和 __STDC__ :两个只能出现一个。前者是编译c++生成,后者是编译标准C生成
   __LINE__和__FILE__:当前编译的文件名和当前被编译行数
   __DATE__和__TIME__:编译日期和时间
   其中__LINE__和__FILE__会再编译期间变化,其他四个不变:
   #ifdef __cplusplus
    cout<<"c++\n";
    #endif
    cout<<"file: " << __FILE__ << endl
        <<"line: " << __LINE__<<endl
        <<"date: " <<__DATE__<<endl
        <<"time: " << __TIME__<<endl;

9. c库文件引入时无需使用using语句如#include <assert.h>,但是c库文件对应的C++文件引入时
需要使用using指令,如#include <cassert>  using namespace std;
  
10. 字符串输入(多个字符串之间用空格隔开)
    string s;
    cin>>s;
    cout<<"s=" + s<<endl;
   
    string s1, s2;
    cin>>s1>>s2;
    cout<<"s1="<<s1<<"; s2="<<s2<<endl;
 
    string cnt;
    while(cin>>cnt){
        cout<<"content: "<<cnt<<endl;
    }

11. 内存泄露
  是指一块动态分配的内存,我们不再拥有指向这块内存的指针,因此我们没有办法将它返还给程序供以后重新使用。
 
12. 静态分配和动态分配:
    int k = 8888; // 静态分配
    int *pk = new int(8888); // 动态分配
    int *pkarr = new int[10]; // 数组的动态分配
    cout<<"k="<<k<<endl;
    cout<<"*pk="<<*pk<<endl;
    delete pk;
    delete [] pkarr;
    cout<<"k="<<k<<endl;
    cout<<"*pk="<<*pk<<endl;  // 此时pk指向的内存已经被回收,该块区域可能为任何值

13. 类定义中的成员函数会被自动当做inline函数

14. 数据类型:
   char:  'a', L'a'(宽字符)
   short
   int:   20, 024, 0x14, 20u
   long:   20UL, 20L, 8LU
   float:  3.14F, 0.1f,
   double:  0.0, 3e2, 1.0E-3, 2.
   long double:  3.14L
   bool:   true false

15. 左右值
  对于每一个变量,都有两个值与其相关联:
  * 它的数据值。或右值。被读取的值。文字常量和变量都可以被用作右值。
  * 它的地址值。或左值。文字常量不能用于左值。
 
16. 初始化
  int i = 100;
  int i(100);
  int i = int();  // 初始化为0
  double d = double(); // 初始化为0
  string s = "xxx";
  string s("xxx");
  string s; // 调用默认构造函数
 
  对于基本类型的全局变量,初始化为0,而它们的局部变量不会被初始化。

17. 指针:存储的是地址值。
    * 初始化:
      int *pi = 0; // 不指向任何对象
      int *pi = &i; // 取地址
      int *pi = pi2; // 指针互相赋值
      int *pi = i; // error. 不能把整形变量赋给指针。
      double d = 1.0; double *pd = &d;
      int *pi = pd; // 不能跨类型给指针赋值
     
      void *pv = pi;  // void类型的指针可以被任何类型的指针赋值
      pv = pd;
     
      // 读写指针所指向的对象
      int i1 = 100, i2 = 200;
      int *pi = &i1;
      *pi = i2;
      *pi = *pi+1;
      *pi = abs(*pi);
     
      int **ppi = &pi; // 指针的指针
      int *pi2 = *ppi;
      cout << i << " -- " << *pi << " -- "
          << **ppi << " -- " << *pi2 << endl;
     
     
      // 有些不能转换的情况
      int i1 = 100;
 int i2 = 200;
 double d =3.14;
 int *pi1 = &i1;
 int *pi2 = &i2;
 int **ppi3 = 0;
 int **ppi4 = &pi1;
 double *pd = &d;

 i1 = i2;  // ok. int-->int
 //i1 = pi1;  // no. int*-->int
    //i1 = ppi3;  // no. int**-->int
    //i1 = pd;  // no. double*-->int
    //pi1 = i1;   // no. int-->int*
    pi1 = pi2;  // ok. int*-->int*
    //pi1 = ppi4; // no. int**-->int*
    //pi1 = pd;   // no. double*-->int*
    //ppi3 = i1; // no. int-->int**
    //ppi3 = pi1; // no. int*-->int**
    ppi3 = ppi4; // ok.int**-->int**
    //ppi3 = pd;  // no. double*-->int**

 

18. bool类型
  // bool变量本身只有true和false两种值
 bool b1 = true;
 bool b2 = false;

 // 可以把bool变量赋值为int类型
 int i1 = b1; // 1
 int i2 = b2; // 0
 cout << "i1=" << i1 << "; i2=" << i2 << endl; // i1=1; i2=0

 // int类型和指针类型可以赋值给bool变量使用.
 // 0和空指针赋给bool时为0,非0和非空指针赋给bool时为1
 int i3 = 100;
 int i4 = 0;
 bool b3 = i3, b4 = i4;
 cout << "b3=" << b3 << "; b4=" << b4 << endl; // b3=1; b4=0

 int *pi1 = &i3, *pi2 = 0;
 b3 = pi1; b4 = pi2;
 cout << "b3=" << b3 << "; b4=" << b4 << endl; // b3=1; b4=0

 // bool变量、int值、指针都可以作为bool表达式进行判断
 if (b1 || i1 || pi1) {
 }

19. 常量
  int i1 = 100;
 const int i2 = 200;  // 常量
 //int *p1 = &i2; // error. 常量的地址只能赋给常量指针
 const int *p1 = &i2;
 //*p1 = 1000; // error. 不能修改常量指针所指向的变量值
 p1 = &i1; // 常量指针的微妙之处是指针本身的值可以重新赋值
 //*p1 = 1000; // 无论常量指针指向的是一个常变量还是一个普通变量,都不能通过指针修改其所指向的值

 // 指针常量
 int *const p2 = &i1; // 指针常量只能指向指向普通变量
 //int *const p2 = &i2;   // 不能指向常变量
 //p2 = &i2;          // 指针常量的微妙之处在于指针本身是个常量,不能再修改它是它指向别的变量
 *p2 = 1000;   // 但是指针常量指向的值可以修改

 // 常量指针常量
 const int *const p3 = &i2; // ok。可以指向常变量或者普通变量
 //p3 = &i1; // 不能修改指针
 //*p3 = 1000;  // 不能修改指向的值

 

20. string对象
  string s1(""); // empty string
  string s1("Hello world");
  string s2(s1); // 拷贝构造
  string s2 = s1; // 赋值
  string s3 = s1 + s2; // 用+连接
  s3 += s3; // 用+=连接
  if (s1==s2) {} // 比较
  int cnt = s1.size() // size()函数
  if (s1.empty()){} // empty函数
 
  // 和c风格字符串互操作
  string s("aaaxxxbbb");
 const char *pstr = s.c_str(); // 返回的是一个指针常量
 cout << pstr << endl; // aaaxxxbbb

 char *ps = "xxx";
 string s1("aaa");
 string s2("bbb");
 string s3 = s1 + ps + s2;
 cout << s3 << endl; // aaaxxxbbb
 
  // 下标操作
  string s("aaaxxxaaa");
 int size = s.size();
 for (int i = 0; i < size; i++) {
  if (s[i] == 'x') { // s[i]是一个char类型
   s[i] = 'yyy';
  }
 }
 cout << "s=" << s << endl; // s=aaayyyaaa

 

21.引用
  引用是对象的别名。
  int i1 = 100, i2 = 1000;
 int &r1 = i1, &r2 = i2; // 定义时必须被初始化。一旦初始化,就不能再指向别的对象。
 r1 = 200;  // 常量-->引用。实际上是给i1赋值
 cout << "i1=" << i1 << endl;
 r1 = i2;  // 变量-->引用
 cout << "i1=" << i1 << endl;
 r1 = r2;  // 引用-->引用
 cout << "i1=" << i1 << endl;


 //int &r = 100; // 不能用文字常量给非const的引用初始化
 //int &r = i + 100; // same above
 const int &r = 100; // ok. 可以把文字常量给const引用初始化

 double d = 3.14;
 const int &r3 = d;  //ok. 可以快类型给引用初始化
 //int &r3 = d; // error. 前面必须加const关键字

  // 引用最常用的地方是作为函数的形参
  void test(const int &i) {
    cout << i << endl;
  }
  调用: int i = 100; test(i);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值