您的位置:首页 > 编程语言 > C语言/C++

c/c++笔记

2016-01-13 15:19 393 查看
objdump

objdump用来显示一个或多个目录文件的信息

objdump -h main.o 显示目录文件各个段的头部摘要信息

readelf

readelf命令是Linux下的分析ELF文件命令

readelf -h main 显示main的EL Header的文件头信息(即ELF开始的前52个字节)

**using 声明**
using std::cout        把std名字空间的cout(某一个)符号印出来
**using指示符**
using namespace std;   把std名字空间的所有符号引出来

const------(const:编译过程宏展开)
const int len = 1024;  // 在C++中,len才是真正的常量(不分配内存),C中为常变量
int  a[len] = {0};    // C++可以;C不可以

const定义的值本文件可以,相当于static,只在当前文件中替换
extetn const int len = 1024; 外部文件可以访问,此时分配内存

**引用 & ----比指针安全**
int a=10;   int b = 20;   double d = 10.24;
int  *p = &a;  // 取地址。指针指向的不一定是一个合法的内存地址
int  &c = b;   // 引用变量。相当于b的一个别名,引用必须引用一个合法内存
int  &c = 10;       // error
const int f = d;    //合法,d是double
const int  &e= 10;  //合法          int  &b = (int)a;  // error

***与const的安全性**
例 int  a = 10;                  修改:1》const int *p = &a;
int  *p = &a;                     2》const int *const *q = &p;
const int **q = &p;//安全性降低
// const 修饰int*,*q不能赋值,但是*p = 40 ;能通过

例 int a = 10;
int *p = &a;              // 编译失败:无法从”int **”转换为”const int **”
const int **q = &p;        // 因为可以通过*q赋值修改a,即修改*p

**explict**
防止类型转换,只针对带一个参数的构造函数
例:CTest t1;  t1=10; //t1 = CTest(10); 显示类型转换
t1 = CTest(10,20);
t1 = (CTest)(10,20);  //逗号表达式相当于t1=(CTest)20;

**new和delete**   // new  type();或new type;
1.分配单个内存空间
int *p = new int (10);   //p:栈内存  int(10):堆内存
delete p;  p=NULL;

2.分配数组
int *p = new int[10];
delete []p ;  p = NULL;

3.常量内存的动态分配
const int  *p = new const int (10);

4.定位new   // new (address) type;
char *p = new char[1024];
TYPE *q = new (p) TYPE;   // 从p中取内存
delete []p;  p = NULL;

**C++类型强转**
1.const_cast:      去除const属性
const int a = 10;
int *p = const_cast<int *>(&a);
2.static_cast:      只支持C++编译器支持的类型间转换
int *p = NULL;
float *q = static_cast<float *>(&p);  //编译失败
3.reinterpret_cast:  类似C语言强转,无安全可言
4.dynamic_cast:   类继承结构向下deep类型转换,支持对象类型转换


类和对象

访问限定符:public private protected

class中可以不加访问限定符,默认private

struct定义的不加访问限定符,默认public

一.成员函数

1.初始化对象的接口——–构造函数(无返回值)

CStudent(); 系统自带默认构造函数,可重载(加参数)。[尽量不要用this指针]

CStudent::CStudent():m_MAX(20); 限定条件参数的初始化

2.释放new分配的内存——析构函数(系统自动调用)

~CStudent(); 不可以重载

3.拷贝构造函数—–把已经存在的对象拷贝给重新创建的对象

CStudent( const CStudent &obj); 生成新的对象

如果类里出现指针,调用new,必须写拷贝构造函数和赋值运算符重载函数

4.赋值运算符重载函数——把已经存在的对象拷贝给已经存在对象

CStudent& operator=(const CStudent &obj);

1.防止自拷贝: if( this == &obj) { return *this;}

2.实现时必须先释放当前对象

3.对象的拷贝

注:以上四个函数系统会默认生成,若没有写调用函数时,这些都是按照字节拷贝赋值

5.内联函数

二.成员函数分量

1.静态成员函数(不含this指针)—-不能操作一般成员变量

不要对象调用,如:student.show(); //error

用类全局调用。 CStudnet::show();

2.一般成员函数(含this指针)—-对象调用

3.const成员函数:在函数后面加const

不能修改一般成员分量的值,const成员变量可修改

void show() const; // () 中省略了 const CStudent *this

void show(); //() 中省略了 CStudent *this

如果在const成员函数中允许修改成员变量的值:

在定义变量前加关键字:mutable。// mutable int m_a;

4.友元函数(友元带来的麻烦 > 帮助) <少用>

作用:定义全局函数访问类中私有或保护成员

用法:在类中任何地方都可以声明,声明前加friend
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: