C++学习总结一

1.  ifstream in ("a.txt");

a. for(int a; in >>a..)  //流一次读入一个字符

b. for(string str ; getline(in ,str);)..//流一次读入一行

 

2. char的运算与int可是为一样

3.char*(char串)和字符串数组类型不同,但是操作上基本一样,都表示C-串的启示地址(但是char*的结尾有个空字符,表示结束)

4. 

a. 逐字输入  cin.get()

b.  逐行输入 cin.getline()

5.  常量,eg:  const int a=7;  //编译期间就可以确定

      

6.

a.  int a[ ]={1,2,3,4,5}

sizeof(a);  //计算a 的空间大小

b.  sizepof(a[0])  //计算元素a[0]的空间大小,结果以字节为单位

 

7.  vector,使用下标([n]),和inerator都可以进行操作

8. c++中cast强转操作方式:

a.  int*  ip=(int*)&f;  //

b.  double ip=double(5);   //只有内置类型才有此种方式

 

9.  

a.  引用类型就是一种隐性指针,指针自身地址就是所操作的实体的地址,

b. 且与指针最大的区别是引用不能修改自身的地址,也就是说引用赋初值后就不能改变了

 

10.   *s++=*s2++  //后增量++就是在 本语句结束后执行的,所以虽然是先++后*,但是由于是后增++,所以s1,s2指针没变

11.

vector<int>  add(..)

{

  vector<int> c (a.szie);

   reurn c;   //函数返回时,如果不是引用和指针,就要做对c进行copy,产生一个临时量,当函数被调用处的表达式结束后,该临时量也就消失了

}

 

12. 函数的声明和函数的指针

int g(int);  //函数的声明可以省略参数名和函数体

int (*gp)(int) ;  //该函数指针为形参的类型是 int(*)(int);   这样定义只是定义了一个函数指针实体,并没有定义函数指针的类型(定义函数指针类型要使用typedef)

typedef int (*fun) (int a);  //这样才是声明一个类型为int(*) (int)的函数指针类型

 

13.  函数声明的形式

a.  int a(int) //可以省略形参名,

b.  int  (int) //函数名和形参声明都可以省略(成为无名函数)

// a只是一种函数的类型,b做函数的声明,也做函数的类型

 

14.  bitset<100> *  p=new bitset<100>;

a.  p->set() //一般指针所指对象调用对象内部方法,成员

b.  所以不用对对象内部成员操作一样先 (*p),然后操作

 

15.  栈空间很宝贵,大数据运算-->使用堆空间

16.     .cpp文件中只对引用到的函数或者类型进行include

17.  全局数据和函数一样只能一次定义,但是可以多次声明, 一般在头文件中声明为 : extend int n=8;

18.

a.  const int a=3;  // 是文件域的,可以在多个文件中重复定义,但在同一个文件中不能重复定义

b.  extend  int  n=8;  //  是程序域,的就不能重复定义

 

19.  作用域就是名空间,

20.  对的作用域是整个程序范围,使用new申请到的空间,

 

21.  C++中名空间的定义总是放入头文件中,eg:

  a1.h

  namespace  a1{

  void  f1(  );

  }

 

22. 

a. 模板定义,全局常量,inline函数,类定义,enum定义,都要使用

# ifndef   DATE

 # define  DATE

struct  DATE{ int year,month,day;};

#  endif  //头文件卫士来防止重复声明

b.  a中的全部定义都可以放入头文件中,函数的实现(定义)除外,

c.  a中的定义都可以在不同的文件中重新被定义,(因为属于内部链接)

 

23.  常成员函数不改变对象的值,  void  print( ) const;

24. 

point a,b,c

point d=a+b+c  //重载的point类型的operator +,返回一个临时的point(a+b的值)参与与C的相加,当该行表达式结束时,该临时point销毁

 

25. count<<a <<b //<<左结合性(从左-->右)返回当前的流,所以可以一直操作

26.  ostream & operator<<(ostream & o,const point & d)

{

 return  o<< ..;     //重载<<,必须返回&(引用),否则会拷贝返回一临时数据

}

 

27.  类和函数的实现与定义可以分开实现,

a. 但是类型实现的cpp中要包入相应要实现的类的头文件,

b. 函数实现文件cpp,中不需要包入相应的头文件

 

28.  成员内联函数,一般都直接写在类定义内部

29.  静态成员不能放在头文件中,应放在类实现中,(类外实现)

30.  其实函数的实现放在任何cpp中都可以,但是要明确是为那个.h的函数进行的实现,如有同名的函数声明则应该在实现的cpp中,加上名空间,

名空间::fun(){  };

31.  DATE  g;  // 无参对象定义

      DATE  f();// 返回类对象的无参函数声明(是个函数的声明),

32. 

a. 在构造函数体中,不能完成对常量成员和引用成员的初始化,

b.如果,构造函数的初始化器中没有为成员进行初始化,也未在构造函数体中进行赋值,则调用该成员的默认构造函数进行构造

 

33. 静态对象是文件作用域对象

34. 指针的空间有类型:指针所指的空间只能放入与指针类型相同的数据,否则要动态强转:  reinterpret_cast<..>

35.

class silly  {

const int ten ;

int& ra;  // 相当于在代码区已定义和声明引用ra,常量ten,(先于构造函数)

public :

  silly(int x,int& a) //构造函数属于二次定义,所以对于常量和引用会有问题,但是在构造函数初始化表中再次初始化没有问题,相当于在代码区的构造阶段

  {

     ten=10;

     ra=a;

  }

}

36.

a.  析构函数与拷贝构造成对出现

b.  形参和实参是拷贝构造的过程//good!

c. 一般赋值拷贝和拷贝构造以及析构函数时同时产生的

 

 

37.  一个对象在构造的时候

a. 首先构造其基类,如果其构造函数中有基类的初始化列表,则按初始化列表参数来构造,否则调用基类的无参构造函数

b.  然后在构造函数调用前,先分配对象的自身空间,全部子对象(成员),按初始化列表进行构造(没有初始化表的,调用其默认的构造)

c.  最后才执行自身的构造函数的本体

 

38.

C++在使用任何东西之前都要先声明,但是只声明“所用到的东西”即可,eg:

class A :public  class  B //在使用 class A的场合只要包入Class  A的头文件即可

 

39. 多态,

GraduateStudent  gs//继承于student

a.  student s=gs;  // 只是拷贝gs的基类部分,将gs转换为基类s

b.  student&* t=gs;

c.  student* p=&gs;

a中把子类中基类部分进行了复制,  b中引用t代表gs中不可分离的基类(student类)的部分。多态只能使用引用或者指针实现

 

40.  要实现多态,必须加上virtual(成员函数,否则不会实现多态)

41.  int* p=static_cast<int *>(malloc (100)); //将局部的堆空间转换为整型数组空间,指针类型的转换,只是告诉编译器用什么类型来识别该空间

42. 

a.  static_cast 不只针对指针转换,只要是相关的类型都可以转换

b.  对有virtual继承的多态转换由dynamic_cast实现(一般针对多态的指针),

 

43. 虚函数的子类和父类的同名函数中,返回类型可以不同,

44. 子类若不override抽象类的纯虚函数,则仍为抽象类(反之为具体类)

45. 抽象类不能创建对象,但是可以使用其的引用和指针

46.

IDATE&  create(int y)

{

return *new DATE(...)  //先New,后*(间引)

}

a.  返回引用类型的结果,其返回就值就不用拷贝(不会产生一个临时量,或者无名量,该无名量放入寄存器中,参与表达式的其他计算,直到本行结束)

b. 但是若返回只为引用类型,应该返回堆中的引用(用new创建的),栈中的局部量都会被收回;//堆中创建的东西不会随着函数收栈而消失

c. 堆中申请的控件必须被delete(使用完以后)

 

********************************模板********************************

47. 模板类型参数没有隐式转换之说,必须精确匹配,eg:

template<typename T>

void  swap(T&a,T&b){...}  //a与b在模板实例化时,类型必须相同(因为是预编译阶段就要确定)

 

48. 使用

a.  static_cast<  >

  dynamic_cast<  > //进行转换操作比较安全,不会报错,最多返回值为0

b.  但是用普通的强转不会成功的话就会报错

 

49.

 

 T*  const& max( T*  const& a, T*  const& b)

{

  // T* (指针)加上&(引用).则直接使用实参指针,而不拷贝构造

//T*  const& a其实就是T类型指针的引用

}

 

 

50.

a.  形参  const int a //是字面常量,比如5,6

b. const  int&  a //为常量引用(是变量,只是限定该变量不能被改变)  ,*和&在类型定义时都紧跟类型后面(good!)

 

51.  模板本质不是类型,不能作为形参的类型

52. 模板铸件可以视为类模板的子类模板,例如:

template <typename T>

class A<T,T> 是template<typename T1,typename T2>

class A{...}的模板的铸件

 

53.  异常

a. dynamic_cast<check& >的转换类型,若为引用,则转换失败后抛出bad_cast异常

b.  若转换对象为指针,eg:dynamic _cast<check *>,转换失败后,返回0

 

54.  可以使用typeid进行类型比较,eg:

class A; 

A a;

if(typeid(A)==typeid(a))  //进行类型比较,可以是对象,指针或者引用

{

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值