C++学习备忘录(一)

1、rand() 生成随机数  rand()%100+1 ==>生成1-100之间的随机数。

2、int &a = 10; 报错  可以用 const int &a=10;

void showValue(const int & val)

{

    val=100; //error  val 不能修改
}

3、函数的占位参数:void func(int a,int) {}   第二个参数就是占位参数。 占位参数也可以有默认值。

4、函数的重载:同一作用域下, 函数名相同,参数类型不同,参数个数不同,参数顺序不同。 但是如果只是函数的返回类型不同不可以

     当函数引用作为参数传递时, void func(int & a)  和void func(const int  & a) 属于不同的参数类型。、

     函数中使用默认参数,虽然能编译通过,但是调用时会报错,所以要避免。 func(int a,int b=10)  func(int a)   func(10);//调用时报错

 5、类的三种权限:public protected private   默认是private;  struct 默认是public.

6、类的构造函数可以有参数,但是析构函数不能有参数。

7、类的拷贝构造函数写法:  必须用常量引用,不能修改传入的类。

class Person

{

    Person(const Person &p)

  {
  }
};

8、匿名对象 Person(10); 调用完后系统会立马回收。

9、类的隐式调用构造函数:  Person p=10;  //等价于Person p=Person(10);

10、构造函数调用规则: 如果提供了有参构造函数,系统不在默认添加无参构造函数,但是会添加拷贝构造函数。

当提供了拷贝构造函数时,系统不会默认添加其他构造函数。

11、类外不能访问私有静态成员函数。  private: static void func2();   

12、静态成员函数的两种访问方式: Person p1;  p1.func2();        Person::func2();

13、空对象()Person p;  sizeof(p)  =1;   空对象的内存地址是1个字节,编译器为了区分不同的空对象内存地址而分配。

14、静态成员变量  类内定义,类外初始化。

15、只有类的非静态成员变量属于类的对象上,非静态成员函数

16、this指针  指向被调用成员函数所属的对象 :可以解决成员变量重名问题  this->age=age ,  在函数内返回对象本身  return *this;

this的本质是指针常量,指向的对象不可修改  相当于 Person * const this;  也可以让this指针本身不可修改,  const Person * const this;

17、常函数:  成员变量不可修改,可以加mutable关键字使之可修改。

void show() const 

{

  a=10;// error

  b=10;// ok

}

int a;

mutable b;

18、常对象:const Person p;  p.a=10;//error   常对象只能调用常函数,不能调用普通成员函数,因为成员函数可以修改成员变量。

19、友元  访问类的私有成员:  全局函数做友元   friend void goodBoy(Person * p);  

类做友元  friend class Person;

类的成员函数做友元; friend void Person::visit();

20、 虚继承   解决菱形继承:vbptr 指向 vbtable

21、指针占4个字节。

22、动态多态  virtual: 父类中有虚函数指针 vfptr 指向vftable(表内记录虚函数的地址)   子类的虚函数表会覆盖父类的虚函数表

23、抽象类  只要包含纯虚函数就是抽象类 : virtual void func()=0;       子类必须重写抽象类的纯虚函数,否则无法实例化。

24、虚析构和纯虚析构函数: 相同点是解决父类无法释放子类对象的问题。都需要有具体的函数实现。   不同点是纯虚析构函数是抽象类,不能实例化对象。

指针的释放:    string * name;   

~func()

{

    delete name;

    name=NULL;

}

原文地址:https://www.cnblogs.com/taofengfeng/p/13696241.html