C++ 大学课堂知识点总结
1.引用
int b;
int &a = b;//a是引用类型 定义的时候加& 表示引用 其余都是取地址
a是b别名 使用a和使用b是一样的 主要用于函数传参
引用 相当于外号 不占内存 引用是常量 定义的时候就一定要赋值 不能修改指向
指针 指针变量 存放的是地址 占内存 定义的时候并需要赋值
&a;//取地址
函数 作用 : 代码封装-->减少重复代码 划分模块 便于维护
函数调用的时候-->函数跳转(需要时间)
2.1内联
关键字 inline 内联函数--> #define M(a, b) ((a)+(b))
内联 函数 用起来和函数一样 适用于短的函数 并且常用的函数
长的函数 循环 函数调用 不适用于内联
相对于 带参宏定义的好处 参数有类型 不需要考虑优先级 直接当函数使用
C++允许函数同名 参数不一样(1.参数个数 2.类型)
a + b--> int fun(int a, int b)
double fun2(double a, double b)
-->int fun(int a, int b)
double fun(double a, double b);
一个函数名实现相近多个功能 调用函数的时候通过参数区分
仅返回值不同不构成重载
计算机通过参数类型区分调用哪个函数
定义函数的时候给参数设定默认值 调用函数的时候 这个参数可以省略
函数定义的时候能不能缺省 ? 能
函数定义的时候在参数里面写
如果函数有声明 有定义 只需在声明中缺省
缺省 只能从右往左缺省(允许全部缺省)
调用的时候 不确定调用哪个函数-->二义性(重载和缺省同时使用的时候)
4.new delete
-->new 申请 内存 malloc
--->delete 释放内存 free
申请10个int大小的空间
int *p = (int*)malloc(sizeof(int)* 10);//C语言
free(p);//C语言的内存释放
int *p = new int[10];//C++的内存申请 10个int
delete[] p;//释放内存 []放delete后面 []里面不需要加数字 delete[] p;
int *q = new int;//申请一个int
delete q;//释放内存
int *p = new int[m];//申请的时候[]里面的数字是多少个变量 m个int的大小的空间
struct node*p = new node;//申请内存
5.简单的输入输出
cin cout 输入输出 endl 换行
cin >>
cout <<
1.面向对象的思想
面向过程 1.创建界面 2.生成地图 3.贴图 4.用户点击 5.判断
以函数为中心
面向对象 用对象描述-->对象-->数据为核心
抽象 封装 继承 多态
C语言 结构体
struct student
{
//成员变量
};
C++的类
class student
{
//成员变量
//成员函数
};
对象用.对象指针 ->
public 公有 外部可以直接访问 所有人都可以用
private 私有 类的内部进行访问 但是外部不能访问
protected 受保护的 和私有类似
类中的成员变量 成员函数 默认私有
成员函数中都有一个this指针(和普通函数区别) 指针指向当前对象
区分参数和成员(如果参数名和成员名不一样 那么可以省略this指针)
类的成员函数并不是一定要在类里面定义 可以在类外定义 在类里面声明
C++ 的结构体中可以有成员函数(C语言结构体不行) private / protected / public C++结构体定义变量的时候不需要加struct关键字
struct student pointer;
区别 结构体成员默认公有 类的成员默认私有
结构体 一般只用来存放数据 类中有函数
C++结构体中也可以写函数
对象大小只和成员变量的大小有关
1.构造函数
函数给对象成员初始化-->构造函数(构造器)
构造函数 1.和类名相同 2.没有返回值类型 也没有返回值 3.调用构造的方式 对象出生自动调用(只会调用一次)
类中成员 没办法在类外访问->使用的时候赋默认值 初始化
函数名和参数-->重载 缺省
析构函数 释放资源(比如说类中的指针 申请内存 交给析构释放_)
析构函数名 ~类名 没有返回值类型, 没有参数 自动调用(对象销毁的时候调用)
new 调用构造 malloc不会
delete 调用析构 free不会
delete[] 调用所有对象的析构函数
const 常属性 只能通过初始化形参列表赋值
初始化形参列表的写法
初始化形参列表可以给const成员赋值 也可以给普通成员变量赋值
不属于某个对象 属于整个类
这个类的所有对象共用static属性成员
类--> class --->定义的变量叫做对象 作用域:全局
1.类-->提供4个默认函数
默认构造函数(没有参数的构造函数)
析构函数
拷贝构造
赋值函数
*调用时机 1)定义对象的时候 A a(A类型的对象)
2)定义对象的时候 用 = 初始化 A a = A类型的对象;
3)隐性调用 传递参数 形参拷贝实参
2.拷贝构造中 单独申请内存-->深拷贝
没有单独申请内存-->浅拷贝
浅拷贝-->两个指针指向同一个区域 释放内存会出问题
默认的拷贝构造是浅拷贝
没有写引用 有一个临时对象
对象 一般传参都会传递引用
const 常属性 const int x定义必须赋初值 赋值之后不能修改
类中的const成员变量 赋值初始化形参列表赋值
const成员函数 在成员函数后面加const 里面不能修改类成员变量的值
不能调用其他非const成员函数
const加在函数前面 修饰返回值类型
const加在函数的括号里面 修饰 参数类型
传递const引用 可以避免在函数修改实参的值
--> const int*和 int*const
const int*p 常量指针 *p的值不可以修改但指向可改变//int const *p
int*const q 指针常量 q的值能修改但q不能改指向
3.static成员(成员变量 / 成员函数)
1)修饰全局变量 不能在外部文件访问(extern指明访问访问其他cpp的变量)
2)修饰函数里面的变量 只会定义一次(静态存储区 函数调用结束先不释放)
3)修饰成员变量 static成员变量 不属于单个对象 属于整个类(赋初值 要在类外赋初值)
4)修饰成员函数 也是属于这个类 只能修改静态成员
(static修饰成员函数 没有this指针)
1.友元
数据--->私有 不能在类外访问 安全性
访问里面数据的时候-->通过函数访问 速度慢
针对常用的,需要使用类中私有成员的函数-->友元
友元 可以访问类中 的私有成员
friend 关键字 放在函数前面-->破坏数据封装性
公有成员-->所有函数都能访问
友元函数 是类的成员函数么 ? 不是
友元 外部访问私有成员的机制
通过成员函数访问私有成员-->友元提高 运行效率
缺点 破坏数据的封装性 导致程序的可维护性变差
友元类:将一个类A声明成另外一个类B的友元 这个A中所有成员函数可以访问类B的私有成员
A是B的朋友 B是不是A的朋友 ? 不是
我把你当朋友 你把我当(...自行脑补)
A是B的朋友 B是C的朋友 A是不是C的朋友 ? 不是
---> 友元类 不能传递
私有成员不能在类外访问 不影响友元
类中的函数 声明成另外一个类的友元
2.运算符重载
运算符 基本数据类型使用运算符-->在自己定义的对象之间使用运算符
PS:运算符重载不是一定要写 写了之后可以实现在自己的对象之间使用运算符操作
访问对象中的数据 1.成员函数 2.友元函数 --->a + b
operator运算符(参数)
运算符重载 函数参数个数必须和操作数个数一致
函数的实现 不要违反运算规则
优先级问题:重载时候不要改变优先级顺序
不可以创造新的运算符
双目-->推荐写友元函数 两个参数可以交换顺序
(2)关系运算符 == != > < >= <= 双目运算符
(3)逻辑运算符 && || !
(4)自增 自减(前++ 后++)
(5)位运算符
(6)赋值运算符 += -= (= 额外讲)
(7) ()[] * & ->
()--> A a; a();//调用的重载()运算符 函数调用 函数名(参数)
重载()的目的 让这个对象更像函数 仿函数 对象-->模仿函数
对象名(参数) 仿函数 调用方式和函数形式一样
1)仿函数 参数 仿函数 返回值
构造 在对象出生时调用 只会调用
仿函数 在对象出生之后调用 想调用几次就调用几次
[]--> string-->里面存了字符串 string st("hello"); 假装是数组 char*
-->st[3]-->'l'
重载[] 对象中放数组 / 指针(申请动态数组) int数组
* 里面有指针
& 返回某个成员的地址
-> 里面有结构体 / 对象 成员 返回结构体 / 对象的地址 struct
(8)new delete
new运算符 三个操作
1)operator new (可以重载的部分)主要作用 分配内存
2)调用构造函数
3)返回一个指针
1)调用析构
2)释放内存 operator delete (可以重载的部分)
* operator new() 和 operator delete() 是隐式的static成员。因此,它们无法使用this指针,也不能修改对象的值。一般不建议改写。
#include<iostream>
using namespace std;
class String
{
private:
char* m_data;
size_t length;
public:
//构造函数
String(const char *str=NULL)
{
if (str == NULL)
{
length = ;
m_data = new char[];
*m_data = '\0';
}
else
{
length = strlen(str);
m_data = new char[length + ];
strcpy(m_data, str);
}
}
//构析函数
~String()
{
delete[] m_data;
length = ;
}
//拷贝构造
String(const String &other)
{
length = strlen(other.m_data);
m_data = new char[length + ];
strcpy(m_data, other.m_data);
} //获取字符串长度
size_t size()const
{
return length;
} // [] 重载
char& operator[](int n)const
{
if (n >= length)
return m_data[length - ];
else
return m_data[n];
}
// = 重载
String& operator=(const String &other)
{
if (this == &other)
return *this;
if (m_data)
delete[] m_data;
length = strlen(other.m_data);
m_data = new char[length + ];
strcpy(m_data, other.m_data);
return *this;
}
// + 重载
String operator+(const String& str)const
{
String newstr;
newstr.length = length + str.size();
newstr.m_data = new char[newstr.length + ];
strcpy(newstr.m_data, m_data);
strcat(newstr.m_data, str.m_data);
return newstr;
}
// += 重载
String& operator+=(const String& str)
{
length += str.length;
char* newdata = new char[length + ];
strcpy(newdata, m_data);
strcat(newdata, str.m_data);
delete[] m_data;
m_data = newdata;
return *this;
}
// == 重载
bool operator==(const String& str)const
{
if (length != str.length)
return false;
return strcmp(m_data, str.m_data) ? false : true;
}
// >> 重载
friend istream& operator>>(istream& is, String& str)
{
is >> str.m_data;
return is;
}
// << 重载
friend ostream& operator<<(ostream& os, String& str)
{
os << str.m_data;
return os;
}
// < 重载
friend bool operator <(const String& s1, const String& s2)
{
if (strcmp(s1.m_data, s2.m_data) < )
return true;
return false;
}
// > 重载
friend bool operator >(const String& s1, const String& s2)
{
if (strcmp(s1.m_data, s2.m_data) > )
return true;
return false;
} }; class A
{
int x,*y;
A *p;
public:
A(int m)
{
x = m;
y = &x;
}
A(const A&other)
{ }
~A()
{ } A& operator&(A&other)
{
this->y = &other.x;
return *this;
}
friend A operator*(A&other)
{
return *(other.y);
}
A* operator->()
{
return p;
}
friend ostream&operator<<(ostream&os, A&other)
{
int q = *other.y;
os << q;
return os;
}
};
int main()
{
String str1("hello"),str2("world");
cout << str1 << endl << str2 << endl << str1 + str2 << endl;
str1 += str2;
cout << str1 << endl;
A a(),b(),c();
int x;
cout << (a&b) << endl << (*c=a) << endl;
return ;
}
继承 从已有类中加上属性(成员变量)和方法(成员函数)定义一个新的类型
已有类 基类 / 父类 新的类 派生类 / 子类
父类派生子类 子类继承父类
2.调整
2.1访问控制
父类的成员访问权限 public private protected
继承方式
public public 不可访问 protected
private private 不可访问 private
protected protected 不可访问 protected
(子类成员的访问权限)
继承方式 默认私有
父类的私有成员在子类中不能访问
子类继承过来的父类的成员函数去访问
private 子类继承过来不能访问
父类的成员得到隐藏
想要访问父类的同名函数 用类名
3.多继承 多个父类派生一个子类(C++有 其他语言没有)
多继承怎么写
子类拥有所有父类中所有的成员
多个父类有同名成员变量 成员函数(参数)
子类中新定义的成员和父类成员同名(隐藏)
A派生B和C B和C共同派生D D有两份来自爷爷中的成员
解决菱形继承方法-->虚继承 virtual
//解决方案 让B和C 虚继承A(两个子类都要virtual)
//实现的机制
孙子类 就一份来自祖父类的拷贝
虚继承--->解决菱形继承的问题---->孙子类
虚继承需要写在father中
B + C---->D(B(A(x, y), z), C(A(x, y), z), z) 菱形继承
虚继承-->D(B(z), C(z), A(x, y), z)// B::z C::z z
PS:这里还涉及到一个知道点----偏移量,有兴趣先自己去了解,暂时不做讲解
#include<iostream>
using namespace std; class people
{
protected:
int age;
int height;
int ID;
char name[];
public:
people(){ cout << "调用people构造函数" << endl; }
~people(){ cout << "调用people构析" << endl; }
};
class man :virtual public people
{
protected:
char sex;
int num;
public:
man(){ cout << "调用man构造函数" << endl; }
~man(){ cout << "调用man构析" << endl; }
};
class student :virtual public people
{
protected:
int num;
int stuID;
public:
student(){ cout << "调用student构造" << endl; }
~student(){ cout << "调用student构析" << endl; }
}; class maleStu :public man, public student
{
int num;
public:
maleStu(){ cout << "调用maleStu构造" << endl; }
~maleStu(){ cout << "调用maleStu构析" << endl; }
void fun()
{ } }; class maleStu1 :public student, public man
{
int num;
public:
maleStu1(){ cout << "调用maleStu构造" << endl; }
~maleStu1(){ cout << "调用maleStu构析" << endl; }
void fun()
{ } }; int main()
{
{
maleStu a;
a.fun();
}
cout << endl;
{
maleStu1 b;
b.fun();
} cin.get();
return ;
} /*
结果:
多继承中 父类构造函数按照继承顺序进行调用在前的先调用在后的后调用
虚继承中 孙子类的构造函数调用父类和爷爷类的构造函数 顺序 爷爷类->父类1->父类2->...->孙子类 */
多态 一种形式 多种状态
想想USB接口 每种线功能不一样-->多态
一个基本保证:一个指针永远不应指向这样的对象——不能提供指针所承诺的最基本的属性
覆盖 子类重写父类的虚函数 父类的函数得到覆盖(用父类指针调用 调用的也是子类函数)
隐藏 子类重写父类的函数 父类的函数得到隐藏
//virtual void eat() = 0;// 纯虚函数
*一个有纯虚函数的类(虚类 / 抽象类 / 接口类) 没办法定义对象 只能定义指针
*如果子类继承了父类的纯虚函数 然后没有实现 那么这个子类也是虚类 不能创建对象
析构 建议写虚析构
//虚函数 类中定义了新的虚函数 类中会多出来一个指针(虚表指针)
实现多态的方式 子类通过重写 修改虚表中函数的地址
2.不能是静态成员函数
3.不能是内联函数(会处理成非内联函数) inline (PS: 类中实现的成员 默认处理成内联函数)
4.构造不能为虚函数 析构一般写虚函数
#include<iostream>
using namespace std;
class father
{
protected:
int x;
public:
father();
virtual void fun()//虚函数
{
cout << "父类的函数" << endl;
}
virtual void eat() = ;// 纯虚函数
virtual ~father(){} };
//多个函数 father::father()
{ } class son :public father
{
public:
void fun()
{
cout << "子类的函数" << endl;
}
void eat()
{
//
}
};
class son2 :public father
{
public:
void fun();
//{
// cout << "hello world" << endl;
//}
};
void son2::fun()
{
cout << "hello world" << endl;
}
void fun(father *p)//形参是父类指针 实参 是子类对象的地址
{
p->fun();
}
int main()
{
//son ss;
//father*p = &ss;
//p->fun();
//cout << sizeof(ss) << endl;
//x.fun();
//father fa;
son s1;//调用的是子类的构造函数
//son2 s2;
fun(&s1);
//fun(&s2);
cout << sizeof(son) << endl;
father *p= new son;//调用的是 子类的构造函数
delete p;//调用什么的析构函数 析构函数写成虚函数 cin.get();
return ;
}
cin / cout 输入输出流
文件流
ifstream 输入文件流 从文件中读取内容
ofstream 输出文件流 输出内容到文件
字节流 存二进制的方式 直接打开文件 可能会乱码
C++文件操作 对象和文件绑定
open 打开文件 close 关闭
is_open 判断是否打开成功
读取和写入
字符流 get put
字节流 read write
>> 从文件中读取数据 << 写入文件
文件指针
输入的文件流指针 seekg tellg
输出的文件流指针 seekp tellp exe-->文件
//file.open("1.txt", ios::in | ios::out | ios::binary);//打开文件 文件名+打开方式
//ios::in 读取 ios::out写入 ios::app 追加 ios::binary二进制方式打开
//file.get(ch);//从文件中读取一个字符
//file.getline(arr,100); //从文件中读取一行字符
//file.put(ch);//写入一个字符到文件
//file.put('h');
//file.write("hello world", 12);//写入文件 第一个参数char* 第二个参数代表大小
//file.read(arr, 12);//从文件中读出 第一个参数 读出来之后放的位置 第二个参数 大小
//file << "hello world";//写入文件
//file >> arr;//读取文件
//std::streamoff x = file.tellp();//返回文件指针当前位置距离文件开头的偏移量
//file.seekp(x, ios::beg);//第一个参数 偏移量 第二个参数 文件相对位置
//ios::beg 文件开始 ios::end 文件末尾 ios::cur 文件指针当前位置
输入 cin
cin >> x;
int cin.get();//得到一个字符 getchar()
istream& cin.get(char&ch);
istream& cin.get(char*arr, streamsize n);//arr是数组名 n是大小
istream& cin.get(char*arr, streamsize n, char end);//读取到这个end这个字符 提前结束
istream& cin.getline(char*arr, streamsize n);//arr是数组名 n是大小
istream& cin.getline(char*arr, streamsize n, char end);//读取到这个end这个字符 提前结束
iomanip头文件
hex / oct / dec 16进制 / 8进制 / 10进制 默认是10进制 cout << hex << 233 << endl;
2.精度控制
setprecision(4)//设置小数的位数
setiosflags(ios::fixed);//固定小数位
cout << setiosflags(ios::fixed) << setprecision(4) << 3.141592654 << endl;
cout << fixed << setprecision(5) << 3.141592654 << endl;
//用指数方式 setiosflags(ios::scientific)
3.宽度控制 左右对齐
setw(n) 设置宽度 最小输出的位数 set width
setiosflags(ios::left)//左对齐
setiosflags(ios::right)//右对齐
输入 输出
输入数据之后(炒饭)-->按了回车 进入缓冲区(上菜)---->程序读取缓冲区的内容(夹菜)
输入10个字符-->读取了5个字符 剩下5个字符留给下一次 输入缓冲区
回车作为结束-->while ((ch = getchar()) != '\n'&&ch != EOF);//清空缓冲区
printf("输入字符");//提示用户输入什么内容
scanf("%c", &ch);
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
char a[];
int main()
{
fstream flie;
flie.open("1.txt", ios::in | ios::out|ios::binary);
if (!flie.is_open())
{
cout << "文件打开失败" << endl;
return ;
} //string a;
//flie >> a; flie.seekp(, ios::end);
streamoff x = flie.tellp();
int y = (int)x;
flie.seekp(, ios::beg);
flie.read(a, y);
for (int i = ; i < y; i++)
{
a[i] += ;
}
//cout << a;
flie.seekp(,ios::beg);
flie.clear();
flie.write(a, y);
flie.close();
return ;
}
简单加密
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
char a[];
int main()
{
fstream flie;
flie.open("1.txt", ios::in | ios::out | ios::binary);
if (!flie.is_open())
{
cout << "文件打开失败" << endl;
return ;
} //string a;
//flie >> a; flie.seekp(, ios::end);
streamoff x = flie.tellp();
int y = (int)x;
flie.seekp(, ios::beg);
flie.read(a, y);
for (int i = ; i < y; i++)
{
a[i] -= ;
}
//cout << a;
flie.seekp(, ios::beg);
flie.clear();
flie.write(a, y);
flie.close();
return ;
}
简单解密
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{
fstream file1,file2,file3;
string arr1,arr2;
file1.open("1.txt", ios::in);
file2.open("2.txt", ios::in);
file3.open("3.txt", ios::out);
if (!file1.is_open() && !file2.is_open() && !file3.is_open())
{
cout << "文件打开失败" << endl;
return ;
}
char arr[];
file1 >> arr;
file3 << arr;
file2 >> arr;
file3 << arr;
file1.close();
file2.close();
file3.close();
return ;
}
八、异常
程序执行期间产生的问题--->(代码没问题)
try catch throw 三个关键字
catch 捕获 异常
throw 抛出异常
1.如果异常没有处理 -->调用abort()函数 中断程序
2.throw 可以在任意地方抛出异常
3.多级异常处理 里面的异常自己不能处理 继续往外丢
4.catch(...) 表示接受任意类型的异常
{
try
{
throw "hello";
}
catch (int x)
{
}
}
catch (int x){}
重载-->一个函数名 多个函数
模板 数组 链表 顺序表
1.模板分为 函数模板 类模板
template
2.函数模板
add 两个数字相加 针对仅仅是参数类型不同的函数
使用
函数模板--->传递实际类型-->模板函数
类模板--->传入实际类型--->模板类--->用模板类创建的对象
需要强调的部分
(1)类型必须指明
(2)成员函数在类外定义必须单独加上模板头
(3) 在.h里面写模板类 函数在类外定义 不要放cpp里面 直接放.h里面
重载时,函数名一样参数也一样会怎么样? 重定义
该怎么办? 命名空间
namespace summer//定义
{
//里面写函数或者变量
}
使用
1. using namespace 命名空间的名字; //最简单 但是不安全
后面直接使用函数或者变量
2. 命名空间名::函数名() //::域名解析符
指出使用哪个命名空间的函数 安全 但是最麻烦
3. 直接using std::cin; 后面直接使用cin就行 安全 比较简单
命名空间 可以嵌套
1.对象什么时候结束生命周期
作用域{} 出了作用域,对象结束生命周期
2.析构只释放构造函数中的指针
一般只用于对象内部指针
3.返回值为引用 和不为引用的区别 是否返回一个临时对象
结论 如果要进行连续操作 比如++++++a 返回引用 a = b = c = d = e 返回引用
4.父类构造析构和子类的构造析构一样么?? 不一样
子类需要写自己的构造和析构
子类调用构造函数的时候 需要先调用父类的构造及函数
子类调用析构之后 调用父类的析构函数
如果没有显性调用父类构造 会调用默认父类的构造函数
5.虚继承之后 只有一份拷贝 祖父类成员在孙子类成员中只有一份拷贝
C++ 大学课堂知识点总结的更多相关文章
- 【C#】课堂知识点#2
课堂上老师讲了几点,自己觉得挺重要的,记录下来 1.代码字体调大,方便调试 2.虚心请教,没有谁比谁厉害,不会就虚心多请教,baidu并不能解决所有问题.沟通交流也是一种能力 3.只有每行写对了,才继 ...
- 【C#】课堂知识点#4
1.回顾类中基本结构. 成员分为: a.(数据成员) , b.(方法成员) 数据成员: 字段 方法成员:方法,构造函数,属性,索引器,运算符. 属性的作用: 对字段进行访问提供get,set方法. 类 ...
- 【C#】课堂知识点#3
1.讲解了实验1中,利用Char.is***来进行判断字符类型. using System; using System.Collections.Generic; using System.Linq; ...
- 【C#】课堂知识点#1
标准数字格式字符串 https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-string ...
- 大学启示录I 浅谈大学生的学习与就业
教育触感 最近看了一些书,有了一些思考,以下纯属博主脑子被抽YY的一些无关大雅的思考,如有雷同,纯属巧合.. 现实总是令人遗憾的,我们当中太多人已经习惯于沿着那一成不变的"典型成功道路&qu ...
- [转载]我的Java后端书架 (2016年暖冬4.0版)
[转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...
- java后端书籍推荐
书架主要针对Java后端开发. 3.0版把一些后来买的.看的书添补进来,又或删掉或降级一些后来没有再翻开过的书. 更偏爱那些能用简短流畅的话,把少壮不努力的程序员所需的基础补回来的薄书,而有些教课书可 ...
- 我的Java后端书架 (2016年暮春3.0版)
04月 24, 2016 | Filed under 技术 http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后 ...
- Java后端书架
本书架主要针对Java后端开发与架构. 更新记录:4.0版把第五部份-具体技术的书整块拿掉了.<TCP/IP详解 卷1:协议>出到了第二版,增加<SRE:Google运维解密> ...
随机推荐
- Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
- asp.net中SQL语句太长,怎么换行写?
http://bbs.csdn.net/topics/390639485?page=1 string strfac="insert into CarInfo values('"+T ...
- python---django初步了解以及安装(包括Django网页首次无法访问的原因及解决方法,以及在linux服务器上布置无法启动的原因)
pip install Django 相关网站资源: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是 ...
- 机器学习:分类算法性能指标之ROC曲线
在介绍ROC曲线之前,先说说混淆矩阵及两个公式,因为这是ROC曲线计算的基础. 1.混淆矩阵的例子(是否点击广告): 说明: TP:预测的结果跟实际结果一致,都点击了广告. FP:预测结果点击了,但是 ...
- [整理].net中的延迟初始化器
LazyInitializer类 private void EnsureInitialized() { LazyInitializer.EnsureInitialized(ref _initializ ...
- HTML5 中 Geolocation 获取地理位置的原理是什么?
http://www.zhihu.com/question/20473051?sort=created geolocation的位置信息来源包括GPS.IP地址.RFID.WIFI和蓝牙的MAC地址. ...
- iOS-Socket编程体验
CHENYILONG Blog Socket编程体验 Socket编程体验 技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/lu ...
- 【源码阅读】Mimikatz一键获取远程终端凭据与获取明文密码修改方法
1.前言 mimikatz框架是非常精妙的,粗浅讲一下修改的思路. 它的模块主要由各个结构体数组组成,根据传入的命令搜索执行相应命令的模块 mimikatz.c 部分代码: NTSTATUS mimi ...
- flask基础之请求钩子(十二)
前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ...
- [Android]Eclipse 安装 ADT[Android Development Tooling] 失败的两种解决办法
原因 最近想在新装的 Win7 里搭建一下 Android 的开发环境,虽然现在有 Android Studio 了,不过还是习惯 Eclipse 一点.众所周知的原因,Eclipse 直接安装 AD ...