c++秘籍 绝对原创 不经典我不发

基础:
标准main函数:
int main(int argc,char *argv[]);
或int main(int argc,char **argv);//argc:参数个数 argv:参数
内存区:
栈:局部变量,自动释放。
堆:new delete
自由存储区:malloc free
全局/static存储区:共用一块内存。
const存储区:不允许修改。
混合类型:
auto //vs2010
特殊常量:
__FILE__ 当前文件名
__LINE__ 当前行号
__TIME__ 编译时间
__DATE__ 编译日期
__FUNCTION__ 当前函数名 //vs2010
强制类型转换(显示转换):
dynamic_cast:运行时识别指针或引用指向的对象。
const_cast:去掉const性质。
static_cast:任何类型转换。
reinterpret_cast:为操作数的位模式提供低层次的解释。
分割字符串:
char *strtok(char *source,char *del);用del分割source字符串,返回strtok数组。
预处理器#的用法:
#define P(EX) cout<<#EX<<":"<<EX<<endl;
int aa = 10;
P(aa);
输出:aa:10
预处理器##的用法:(标志粘贴)
#define FIELD(x) char *x##_string
class Record 
{
private:
FIELD(one);
};
等价于:char *one_string;
#include, #import和#pragma:
#include:导入.h头文件。
#import:导入dll文件。
#pragma comment(lib,"lib文件名"):引用lib文件。
extern“C”的作用:
解决c与c++之间相互调用时函数命名的问题,但不能导出一个类的成员函数。
导出与导入dll的前缀:
_declspec(dllexport) //导出
_declspec(dllimport) //导入
预防多次包含同一头文件:
#ifndef XX_H
#define XX_H
#endif

#pragma once
关闭标识符长度超过256字节的警告:
#pragma warning(disable: 4786)
获取当前距1970年的秒数:
#include <ctime>
time_t long_time;
cout<<time(&long_time)<<endl;
输出当前系统时间:
#include <ctime>
struct tm *times;
time_t long_time;
time( &long_time );  
times = localtime( &long_time ); 
cout<<times->tm_hour<<":"<<times->tm_min<<":"<<times->tm_sec<<endl;
获取变量的数据类型:
typeid(变量名).name()
返回0-n随机数:
#include <windows.h>
int Rand(int N)
{
int ii = rand() % N;//rand()返回0 - 32768
return ii;
}
每次随机数互不相同:
#include <ctime>
srand((unsigned)time(NULL));
系统延时:
#include <windows.h>
Sleep(毫秒数);
打开关闭控制台:
#include <windows.h>
AllocConsole();
FreeConsole();
控制台颜色控制:
用 system("color 0A"); 
其中0是背景色代号,A是前景色代号。各颜色代码如下: 
0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色
Unicode字符串:
前加_T
数组和指针:
清空数组:
char aa[10];
memset(aa,0,10);
指针四要素:
指针类型,指针指向类型,指针指向内存区,指针自身内存区。
有效的指针:
1 保存一个特定对象的地址。
2 指向某个对象后面的对象。
3 0值。
指针初始化或赋值用下列值:
1 0值常量表达式。
2 类型匹配的对象地址。
3 另一对象之后的下一地址。
4 同类型的另一指针。
void*指针:
可以保存任何类型的对象地址,但void*不能赋给其他类型的指针。
数组下标的类型:
size_t (包含在cstddef头文件)。
const与指针:(2和3必须初始化)
1 指向const对象的指针:const int *p = &a;*p为const。
2 指向对象的const指针:int *const p = &a;p为const。
3 指向const对象的const指针:const int *const p = &a;p与*p都为const。
vector遍历的方法:
vector<int> v(n);
1 下标数组:
for(vector<T>::size_type ix = 0;ix != v.size();++ix)
{v[ix] = 0;}
2 迭代器:
for(vector<T>::iterator ix = v.begin();ix != v.end();++ix)
{*ix = 0;}
引用:
指针和引用的区别:
1 指针不需必须初始化,引用必须被初始化。
2 指针初始化后可以改变指向,引用不能改变。
3 指针可以指向NULL,引用不能为NULL。
const引用与非const引用:
非const引用只能绑定与该引用同类型的对象。
const引用可以绑定不同但类型相关的对象或绑定到右值。
const引用的形参:
可以避免复制形参。
引用与非引用的参数传递:
形参为非引用,则复制实参的值。
形参为引用,则的实参的别名。
返回值注意:
千万不要返回局部对象的指针或引用。
string类:
类型未定义的情况:
string:空字符串
内置类型:在函数体外为0,函数体内值不确定
size()函数的类型:
size_type,与unsigned含义相同。
string赋值给char型数组的方法:
必须声明char型数组是const,而且string对象使用c_str()函数,比如:const char *str = st.c_str();
c风格字符串:
它的实例是字符串字面值,类型为const char *(或char []),以NULL为结束符。
find函数:
string name,total;
string::size_type pos;//子串的位置
pos = total.find(name);//用户名在文件中的位置,若返回-1则找不到,否则返回name在total中的索引号。
函数和类:
内联函数:
规模小,被频繁调用的函数。
重载函数:
参数个数,类型或顺序至少一种不同,返回值可同可不同。
构造函数:
名字与类名同名,无类型,无返回值,可以重载。
参数初始化表:
类名::类名(数据类型 形参,...):数据成员(形参),...{}
参数初始化表的使用范围:
任何const或引用成员及没有默认构造函数的类类型成员。
默认构造函数:
无参构造函数和全部参数是默认参数的构造函数都是默认构造函数。一个类只能有一个默认构造函数。 
const函数:
const放在函数名前与const放在函数名后没有本质区别,返回值是否为const没有影响,但是后者只适合类成员函数。
static类成员:
只能在类外初始化(在cpp文件初始化),形式:数据类型 类名::static成员 = 初值。
static成员函数无this指针,且不能为const。
复制控制的方法:
复制构造函数,赋值操作符,析构函数。
复制构造函数:
只有单个形参,其形参是类对象的引用,常用const修饰。形式:类名(类名 &对象名)
复制构造函数的使用条件:
类中有数据成员的指针。
类中有成员在构造函数分配的其他资源。
何时使用this指针:
当函数返回调用该函数的对象的引用。
类名&函数名(形参){..return *this;}
关于exclicit:
exclicit的构造函数可以抑制由其定义的隐式转换,单形参构造函数应定义为exclicit.
析构函数:
无类型,无返回值,无参数,名字与类名同名,一个类只能有一个析构函数,且不能重载。
何时需要显式析构函数:
若需要析构,则也需要复制构造函数和赋值运算符。
构造函数与析构函数的顺序:
先构造后析构,构造函数:基类->子对象->派生类。
析构函数:派生类->子对象->基类。
I/O:
c语言控制台:
scanf("%..",变量名);//ansi字符
sscanf(字符串,"%..",变量名);//格式化输入
wscanf(L字符串,"%..",变量名);//unicode字符
printf("%..",变量名);//ansi字符
sprintf(变量名,"%..",变量名);//格式化输出
wprintf(变量名,"%..");//unicode字符
c++语言控制台:
cin>>..
cout<<..
unicode方式输出汉字:
c语言方式:
wchar_t xx[] = L字符串;
setlocale(LC_ALL,"chs");
wprintf(xx,"%s\n");
c++语言方式:
wchar_t xx[] = L字符串;
wcout.imbue(locale("chs"));
wcout<<xx<<endl;
I/O头文件:
iostream:定义读写控制窗口的类型。
fstream:定义读写已命名文件的类型。
sstream:定义读写存储在内存的string对象。
关于I/O对象:
I/O对象不可复制或赋值,形参或返回类型应为I/O对象的指针或引用。
输出缓冲区:
endl:输出换行符并刷新缓冲区。
flush:刷新流,不添加任何字符。
ends:插入NULL,刷新流。
unitbuf:刷新所有输出。
nounitbuf:将流恢复正常的刷新方式。
ofstream与ifstream:
输出文件流(ofstream)是从内存流向外存文件的数据。(相当于保存)
输入文件流(ifstream)是从外存流向内存文件的数据。(相当于读取)
创建与读取文件:
#include <fstream>
string result;
ofstream os(文件名,ios::app);//创建文件 以追加的方式
if(!os)
{exit(1);//创建文件失败}
ifstream is(文件名);//打开文件
is >>result;//读取文件
os<<内容;//写入文件
is.close();//关闭流
os.close();//关闭流
运算符重载:
运算符重载的要求:
必须具有一个类类型操作数或枚举类型。
成员重载与非成员函数重载:
单目操作符定义为成员重载,双目操作符定义为非成员(友元)重载。
= [] () ->必须定义为成员重载。
不能重载的运算符:
最好不要重载:, & && ||
不能重载: :: .  .*  ?: sizeof
运算符重载的形式:
函数类型 operator 运算符(形参表){...}
流操作符重载:
istream & operator >>( istream &,自定义类 &)
ostream & operator <<( ostream &,自定义类 &)
模版:
函数模版:
template <class mix>
类模版:
template <class mix>
template <class mix> 函数类型 类名<mix>::函数名()
面向对象(OOP):
OOP三大特性:
封装,继承,多态。
多态性的实现:
静态多态性通过函数重载实现。
动态多态性通过虚函数实现。
基类成员在派生类的访问属性:
基类成员 公用派生 私有派生 保护派生
私有成员 不可访问 不可访问 不可访问
公用成员 公用 私有 保护
保护成员 保护 私有 保护
派生类成员的访问属性:
派生类成员 派生类中 派生类外 下层派生类
公用 可以 可以 可以
私有 可以 不可以 不可以
保护 可以 不可以 可以
不可访问 不可以 不可以 不可以
虚函数的范围:
成员函数,析构函数可以为虚函数,非成员函数,静态成员,内联,构造函数都不能为虚函数。
纯虚函数:
virtual 函数类型 函数名(形参表) = 0
抽象类:
含有纯虚函数的类,但不能创建对象。
派生类的构造函数:
派生类名(总参表):基类名(参表),子对象(参表){..}
虚函数表:
虚函数的类中自动放一个指针,为vpointer,它指向一个存放函数地址的表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值