const int *p = NULL;
int const *p = NULL;
//完全等价
int * const p = NULL
//和上面两种情况不同
const int * const p = NULL;
int const * const p = NULL;
int x = 3;
const int *p = &x;
//p=&y; 正确
//*p = 4; 错误
//由于const修饰的是*p,而*p是具体的值而不是地址,所以这里表示*p所指向的值是不可改变的。
int x = 3;
int *const p = &x;
//p = &y;错误的
//因为const修饰的是p,p是地址,因此地址p是不可改变的。
const int x = 3;
const int * const p = &x;
//都不能变。
const与引用
int x = 3;
const int &y = x;
//x = 10;正确
//y = 20;错误,不同通过y修改,但是能通过x修改。
对比例子:
const int x = 3;
int *y = &x;//编译器报错,可变指针不能指向不可变的变量。
int x = 3;
const int *y = &x;//允许。
宏定义编译器不检查语法错误。
函数特性
函数默认值:
void fun(int i, int j = 5; int k = 10); //正确 func(20);func(20,30);fun(20,30,40);
void fun(int i, int j = 5;int k);//错误
有默认参数值的参数必须在参数表的最右端
函数重载
在相同的作用域内
用同一个函数名定义多个不同的函数
参数个数和参数类型不同
在编译过程,会这样getMax_int_int; getMax_double_double
内联函数(关键字inline int getMax(int x, int y)):编译时讲函数体的代码和实参代替函数的调用语句,优点是省去了调用过程,比较快,适合短循环
1:内联编译时建议性的,由编译器决定
2:逻辑简单,调用频繁的函数建议用内联
3:递归函数无法使用内联,即使使用inline关键字,编译器也将他看成普通函数
C++内存管理
本质是资源管理,由操作系统掌控。我们可以做的就是像操作系统申请资源和释放资源
申请内存 new 释放资源 delete 他们是运算符,而不是函数
int *p = new int; //申请单个内存
int *p1 = new int[10]; //申请一块内存
delete p;
delete []p1;
注意会申请失败。用if(p ==NULL)申请失败。
释放内存时,在delete p;后,要设置p=NULL; 否则会有乱七八糟的错误
C++内存分配:
补充在这里。
结构体:
区别:
C 结构体,就是数据的集合,只有成员变量,没有方法。
C++ 结构体和 C++ 类基本一样,可以有成员变量,有方法, 唯一区别就是结构体成员默认访问控制为public,类为private
结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。
1.结构的构造函数和类的构造函数不同。
a.结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
b.结构不能包含以下形式的初始值设定类:base(argument-list);
2.对于结构中的实例字段成员,不能在声明时赋值初始化。
3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。
结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结 构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速 度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
还有一点:struct 与class本质上应该是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ).之所以要保留struct,很大一部分原因是为了与C兼容吧(C++的一篇文章中是这么说的,我感觉还是有一定的道理). class感觉是应该是struct的扩充,除了可以设置成员的访问类型外,还可以有自己的成员函数,可以继承派生等,好象struct能做的class 都能做,但反过来就不行了,如果没有保护数据的要求,struct能做的我都用struct做,比较简单。
C++ 封装
构造函数,析构函数, this指针
类的定义:数据成员,成员函数
累的访问限定符:public, private, protected
从栈中实例化对象,TV tv; TV tv[20];
从堆中实例化对象, TV *p = new TV(); TV *q = new TV[20];
delete p; delete []q;
在栈中定义好对象后用点 tv.type=0; tv.changeVol();
在堆中定义好对象后用-> : p-type=0; p->changeVol();
p[i]->type = 0;
基本的数据类型:
字符串数组,用的比较频繁
#include<string>
string s1;
string s2("ABC");
string s3(s2);
string s4(n,'c);
s.empty();
s.size();
s[n];
s1+s2;
s1 = s2;
v1 == v2;
v1 != v2;
stirng s6 = "hello" + "world" //错误,只能是变量+变量 或者 变量+“dd”
class A{
public: void setAge(int m_age){age = m_age;}
}
优先将其编译成内联函数。
类外定义:
同文件类外定义,分文件类外定义
同文件类外定义:
class Car{
public: void run();
};
void Car::run(){}
//Car.h
class Car{
public:
void run();
}
//Car.cpp
include "Car.h"
void Car::run(){}
#include<>直接从编译器自带的函数库中寻找文件
#include""是先从自定义的文件中找 ,如果找不到在从函数库中寻找文件
如果是自己写的头文件 建议使用#include“”
类的初始化:
类的数据成员存放在栈或者堆中,而方法只存一份,放在代码区
构造函数:对象创建后自动调用,且只调用一次,
1:自动调用
2:构造函数与类同名
3:没有返回值
4:可以重载
5:实例化对象仅用到一个
6:当用户没有定义构造函数使,编译器自动生成。