using namespace std;
cout << "date" << endl;
endl会自动添加换行.
或
cout << "date\n";
int g = 10;
cout << g;
或
cout << g endl;
如果添加using namespace std;
需要
std::cout << “date” << std::endl;
cout << “int i :” << i << endl;
限定符 | 含义 |
---|---|
const | const 类型的对象在程序执行期间不能被修改改变。 |
volatile | 修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。 |
restrict | 由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。 |
auto f=3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一类型
使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
thread_local 说明符可以与 static 或 extern 合并。
可以将 thread_local 应用于数据声明和定义,thread_local 不能用于函数声明或定义。
int my_array[5] = {
1, 2, 3, 4, 5};
// 每个数组元素乘于 2
for (int &x : my_array)
{
cout << x << endl;
}
// auto 类型也是 C++11 新标准中的,用来自动获取变量的类型
for (auto &x : my_array) {
cout << x << endl;
}
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
Lambda 表达式本质上与函数声明非常类似。
[ captures list] ( params ) -> ret {
body }
[ 捕获列表 ] ( 参数列表 ) ->( 返回值类型){
函数体 }
其中参数列表和返回类型是可以省略的
**[captures] (params) -> return_type { statments;} **
auto func1 = [](int x, int y) -> int {
return x + y; };
auto func2 = [](int x, int y) {
return x > y; }; // 省略返回值类型
auto func3 = [] {
global_ip = 0; }; // 省略参数部分
auto f = []{
return 42;};
[]
不捕获任何变量[&]
捕获外部作用域中所有变量,并作为引用在匿名函数体中使用[=]
捕获外部作用域中所有变量,并拷贝一份在匿名函数体中使用[x, &y]
x按值捕获, y按引用捕获[&, x]
x按值捕获. 其它变量按引用捕获[=, &y]
y按引用捕获. 其它变量按值捕获[this]
捕获当前类中的this指针,如果已经使用了&或者=就默认添加此选项auto lambda_func_sum = [](int x, int y) {
return x + y; }; // 定义lambda函数
void (*func_ptr)(int, int) = lambda_func_sum; // 将lambda函数赋值给函数指针
func_ptr(10, 20); // 调用函数指针
引用很容易与指针混淆,它们之间有三个主要的不同:
int& r = i;
double& s = d;
double vals[] = {
10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues(int i) {
double& ref = vals[i];
return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i],最后再返回 shit。
}
// 在调用函数中使用
setValues(1) = 20.23; // 改变第 2 个元素
setValues(3) = 70.8; // 改变第 4 个元素
头文件 | 函数和描述 |
---|---|
该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。 | |
该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 | |
该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。 |
cin >> name >> age;
cin >> name;
cin >> age;
class classname {
public:
private:
protected:
int var;
int func();
};
关键字 类名 {
访问修饰符:
变量;
方法;
};
int classname::func();
classname varname;
int classname::func(int var) {
classvar = var;
}
class Base {
public:
// 公有成员
protected:
// 受保护成员
private:
// 私有成员
};
classname objectname;
objectname.menber = 10;// 直接引用public修饰的成员
继承方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 | 继承引起的访问控制关系变化概括 |
---|---|---|---|---|
public继承 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类的非私有成员在子类的访问属性不变 |
protected继承 | 变为protected成员 | 变为protected成员 | 不可见 | 基类的非私有成员都为子类的保护成员 |
private继承 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成员都称为子类的私有成员 |
classname::classname(void){
};
classname::classname(int var){
};
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
....
}
classname::~classname(void){
};
classname (const classname &obj) {
// 构造函数的主体
}
int main() {
classname obj1;
classname obj2 = obj1; // 此处会调用拷贝构造函数,将obj1作为参数调用obj2的拷贝构造函数
}
class Box
{
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};
class classname {
public:
static int var;
};
classname::var = 0;
class classname {
public:
static int var;
static int staticfun() {
return var;
}
};
classname::staticfun();
class derived-class:access-specifier base-class {
};
class classname:public fatherclass {
};
// 基类
class Animal {
void eat();
void sleep();
};
//派生类
class Dog : public Animal {
void bark();
};
class derived-class: access-specifier base-class {
};
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
可以重定义或重载大部分 C++ 内置的运算符。
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。
重载运算符有一个返回类型和一个参数列表。
…过于复杂,暂时略
class classname {
public:
virtual int func() {
};
};
class classname {
public:
virtual int func() = 0;
};
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
void open(const char *filename, ios::openmode mode);
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 |
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
ifstream afile;
afile.open("file.dat", ios::out | ios::in );
ofstream outfile;
outfile.close();
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );
try
{
// 保护代码
}catch( ExceptionName e1 )
{
// catch 块
}catch( ExceptionName e2 )
{
// catch 块
}catch( ExceptionName eN )
{
// catch 块
}
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
try
{
// 保护代码
}catch( ExceptionName e )
{
// 捕获一个类型为 ExceptionName 的异常。
// 处理 ExceptionName 异常的代码
}
try
{
// 保护代码
}catch(...)
{
// 能处理任何异常的代码
}
#include
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
各个标准异常说明…略
#include
#include
using namespace std;
struct MyException : public exception
{
const char * what () const throw ()
{
return "C++ Exception";
}
};
int main()
{
try
{
throw MyException();
}
catch(MyException& e)
{
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
}
catch(std::exception& e)
{
//其他的错误
}
}
new data-type;
/******************/
double* pvalue = NULL; // 初始化为 null 的指针
pvalue = new double; // 为变量请求内存
delete pvalue; // 释放 pvalue 所指向的内存
char* pvalue = NULL; // 初始化为 null 的指针
pvalue = new char[20]; // 为变量请求内存
delete [] pvalue; // 删除 pvalue 所指向的数组
int **array
// 假定数组第一维长度为 m, 第二维长度为 n
// 动态分配空间
array = new int *[m];
for( int i=0; i<m; i++ )
{
array[i] = new int [n] ;
}
//释放
for( int i=0; i<m; i++ )
{
delete [] array[i];
}
delete [] array;
int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
array = new int **[m];
for( int i=0; i<m; i++ )
{
array[i] = new int *[n];
for( int j=0; j<n; j++ )
{
array[i][j] = new int [h];
}
}
//释放
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ )
{
delete[] array[i][j];
}
delete[] array[i];
}
delete[] array;
#include
using namespace std;
class Box
{
public:
Box() {
cout << "调用构造函数!" <<endl;
}
~Box() {
cout << "调用析构函数!" <<endl;
}
};
int main( )
{
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // 删除数组
return 0;
}
namespace namespace_name {
// 代码声明
}
namespace_name ::code; // code 可以是变量或函数
namespace namespace_name1 {
// 代码声明
namespace namespace_name2 {
// 代码声明
}
}
// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
// 访问 namespace:name1 中的成员
using namespace namespace_name1;
template <typename type> ret-type func-name(parameter list)
{
// 函数的主体
}
#include
#include
using namespace std;
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
int main ()
{
int i = 39;
int j = 20;
cout << "Max(i, j): " << Max(i, j) << endl;
double f1 = 13.5;
double f2 = 20.7;
cout << "Max(f1, f2): " << Max(f1, f2) << endl;
string s1 = "Hello";
string s2 = "World";
cout << "Max(s1, s2): " << Max(s1, s2) << endl;
return 0;
}
template <class type> class class-name {
.
.
.
}
#include
#include
#include
#include
#include
using namespace std;
template <class T>
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
bool empty() const{
// 如果为空则返回真。
return elems.empty();
}
};
template <class T>
void Stack<T>::push (T const& elem)
{
// 追加传入元素的副本
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop ()
{
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// 删除最后一个元素
elems.pop_back();
}
template <class T>
T Stack<T>::top () const
{
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// 返回最后一个元素的副本
return elems.back();
}
int main()
{
try {
Stack<int> intStack; // int 类型的栈
Stack<string> stringStack; // string 类型的栈
// 操作 int 类型的栈
intStack.push(7);
cout << intStack.top() <<endl;
// 操作 string 类型的栈
stringStack.push("hello");
cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
#define 预处理指令用于创建符号常量。该符号常量通常称为宏,指令的一般形式是:
#define macro-name replacement-text
#define MIN(a,b) (a
宏 | 描述 |
---|---|
LINE | 这会在程序编译时包含当前行号。 |
FILE | 这会在程序编译时包含当前文件名。 |
DATE | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
TIME | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用 abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 程序终止(interrupt)信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
signal(registered signal, signal handler)
int raise (signal sig);
#include
pthread_create (thread, attr, start_routine, arg)
参数 | 描述 |
---|---|
thread | 指向线程标识符指针。 |
attr | 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。 |
start_routine | 线程运行函数起始地址,一旦线程被创建就会执行。 |
arg | 运行函数的参数。它必须通过把引用作为指针强制转换为 void 类型进行传递。如果没有传递参数,则使用 NULL。 |
#include
pthread_exit (status)
//等各个线程退出后,进程才结束,否则进程强制结束了,线程可能还没反应过来;
pthread_exit(NULL);
pthread_join (threadid, status)
pthread_detach (threadid)
…
…