除此之外还有两个讲基础知识的博客推荐给大家:
1.https://github.com/CyC2018/CS-Notes
2.https://github.com/linw7/Skill-Tree
3.一个linux内核相关的项目TKeed:
https://github.com/linw7/TKeed
9 月 17
除此之外还有两个讲基础知识的博客推荐给大家:
1.https://github.com/CyC2018/CS-Notes
2.https://github.com/linw7/Skill-Tree
3.一个linux内核相关的项目TKeed:
https://github.com/linw7/TKeed
9 月 10
(由修根据深信服等公司的流出面试题和各公司的面经总结)
本文地址:https://x.wolfmark.org/x-select_2018-09-10_481.html
| 类型 | 比特数 | 有效数字 | 数值范围 |
| float | 32 | 6~7 | -3.4*10(-38)~3.4*10(38) |
| double | 64 | 15~16 | -1.7*10(-308)~1.7*10(308) |
| long double | 128 | 18~19 | -1.2*10(-4932)~1.2*10(4932) |
buffer=(char*)malloc(i+1);
有两个需要注意的地方:
(1) 当定义的是常量指针,需要const两次( const char* const iVar = “C++”),第一个const是防止值被改变,第二个const防止地址被改变。
(2) 当定义到class内时,需要用static来修饰这个变量,防止出现多个实体。
try
{
double *ptr=new double[1000000];
}
catch(bad_alloc &memExp)
{
//失败以后,要么abort要么重分配
cerr<<memExp.what()<<endl;
}
double *ptr=new double[1000000]; if( 0 == ptr)
/*TestC.h*/
#ifndef TESTC_H
#define TESTC_H
#ifdef __cplusplus
extern "C"{
#endif
int add(int a , int b);
#ifdef __cplusplus
}
#endif
#endif
/*TestC.c*/
#include"TestC.h"
int add(int a , int b)
{
return(a+b);
}
/*TestC.cc*/
#include <iostream>
#include "TestC.h"
int main()
{
cout << add(2,5) << endl ;
return 0;
}
/* ADD.h */
#ifdef ADD_H
#define ADD_H
class ADD
{
public:
int add(int a, int b)
{
return(a+b);
}
};
#endif // ADD_H
//*将C++类封装为C函数文件
/*ADD.cc*/
#include "ADD.h"
extern "C" int add_cpp(int a , int b);
int add(int a , int b)
{
ADD tmp ;
return tmp.add(a,b);
}
//*实际调用C++代码的C文件
/* add.c */
extern int add_cpp(int a , int b);
int main()
{
cout << add_cpp(2,3) << endl;
return 0;
}
//A使用隐式转换implicit
class A
{
public:
A(int){}
A(int,int){}
operator bool const {return true;}
};
//B类型使用显式转换explicit
class B
{
public:
explicit B(int){}
explicit B(int,int){}
explicit operator bool const {return true;}
};
int main()
{
A a1 = 1 ; //OK,使用A::A(int)
A a2(2); //OK,使用A::A(int)
A a3{4,5};//OK,使用A::A(int,int);
A a4 ={4,5};//OK,使用A::A(int,int);
A a5 = (A)1;//OK,使用 static_cast
bool na1 = a1 ;//OK,复制构造函数使用 A::operator bool()
bool na2 = static_cast<bool>(a1);//OK 使用static_cast 直接赋值
B b1 = 1 ; //出错,不会使用B::B(int)
B b2(2); //OK,使用B::B(int)
B b3{4,5};//OK,使用B::B(int,int);
B b4 ={4,5};//出错,不会使用B::B(int,int);
B b5 = (B)1;//OK,使用 stbtic_cbst
bool nb1 = b1 ;//出错,不会使用 B::operbtor bool()
bool nb2 = stbtic_cbst<bool>(b1);//OK 使用stbtic_cbst 直接赋值
}
self & operator++();
self operator++(T);//T是类型名,如int
class T{
T(const T&) = delete; //禁用复制构造函数
T(T&&) = default; //启用默认的移动构造函数
};
class SingleSample
{
public:
static SingleSample * getInterface();
private:
SingleSample();
SingleSample(const SingleSample &);
SingleSample & operator=(const SingleSample &);
~SingleSample();
static SingleSample * interface ;
}
//初始化:
SingleSample * SingleSample::interface;
SingleSample * SingleSample::getInterface()
{
return interface;
}
详细内容:https://x.wolfmark.org/x-select_2018-09-29_497.html
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
char s[] ="hello";
char *p = s;
//注意 \0 不算在内
cout << strlen(s) << endl;//5
cout << strlen(p) << endl;//5
cout << sizeof(s) << endl;//6
cout << sizeof(p) << endl;//4
(由修根据深信服等公司的流出面试题和各公司的面经总结)
更多秋招知识请看-秋招总结-猿类面试小书:
7 月 22
注:大田赛归来,没有取得理想的成绩,却也在意料之中,更让我确信了长跑是一个需要时间来沉淀的运动。我总认为摇摆不定的心境是阻碍我稳步向前的最大障碍,凡世的条条框框只会让我断了向前的希望;人的梦想,如果不去做,难道要等到来生?化为灰烬,唯有磨炼己身至一副钢筋铁骨才能踏破这天空。
——————————脩于公元二零一八年七月二十二日夜
4 月 10
由于以前一直在linux服务端上使用mysql,今天在windows笔记本上装了下,顺便写下了过程:
(注:由于软件时境过迁,只保证2018.4.10日(今天)此方法可用,后续软件升级后可能也会有些许出入)
一、在Mysql官网下载Mmysql-5.7.21的ZIP文件(免安装文件)
下载链接为:https://dev.mysql.com/downloads/mysql/
找到你的系统对应的版本下载,比如这里我的是:mysql-5.7.21-winx64.zip
二、解压ZIP文件
比如解压至:D:/soft/ ,更改 mysql-5.7.21-winx64 文件夹名称为 mysql
三、配置环境变量
1、新建一个变量:MYSQL_HOME
变量值:D:/soft/mysql
2、修改path变量
添加一条记录:%MYSQL_HOME%/bin
四、在D:/soft/mysql目录下创建如下my.ini文件
[mysqld]
#绑定IPv4
bind-address = 0.0.0.0
# 设置mysql的安装目录,即你解压缩安装包的位置
basedir = D:/soft/mysql
# 设置mysql数据库的数据的存放目录
datadir = D:/soft/mysql/data
# 设置端口号
port = 3306
# 允许最大连接数
max_connections = 200
# 设置字符集为utf8
loose-default-character-set = utf8
# 开启查询缓存
explicit_defaults_for_timestamp = true
# windows下区分表名大小写(0:不区分,2区分(5.7版本))
lower_case_table_names=2
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
#设置客户端字符集
port=3306
default-character-set = utf8
[WinMySQLadmin]
Server = D:/soft/mysql/bin/mysqld.exe
skip-grant-tables
五、将mysql注册为Windows系统服务
1、使用管路员权限打开CMD(注意管理员权限),在CMD中进入mysql的解压目录
2、运行服务安装命令
mysqld install MySQL –defaults-file=”%MYSQL_HOME%\my.ini”
安装成功后会提示安装成功
备注:如果想要移除该服务,使用命令:mysqld -remove
六、启动mysql服务
1、启动服务命令为:net start mysql
2、此时会提示:
启动不了mysql服务,提示发送系统错误2:”系统找不到指定文件”
①首先打开注册表
win+r打开运行,输入regedit,打开注册表
②更改注册表:找到
HKEY_LOCAL_MACHINE
-SYSTEM
-CurrentControlSet
-services-mysql(服务名)
-ImagePath
更改原来的值(默认目录):”C:\Program Files\MySQL\MySQL Server 5.7\mysqld” –defaults-file=D:\soft\mysql\my.ini MySQL
为(安装目录):”D:\soft\mysql\bin\mysqld” –defaults-file=”D:\soft\mysql\mysql5.6.17\my.ini” mysql
2、打开管理工具 服务,找到MySQL服务。通过右键选择启动或者直接点击左边的启动来启动服务
创建命令:mysqld --initialize-insecure --user=mysql
七、修改root账号密码
刚安装完成时root账号默认密码为空,此时可以将密码修改为指定的密码。
打开数据库:mysql -uroot -p(提示 Enter password,直接回车,默认密码为空)
use mysql;
update mysql.user set authentication_string=password('123456') where user='root'
flush privileges;
quit;
密码修改完成后既可以使用新密码登录。
10 月 07
——————————脩于公元二零一七年十月七日
昨日,闲来无事,遂去闲游,不知欲至何处。想来来江南已一载有余,还未尝见石,曰:三生。石边冷清,遂取笛而鸣,然声涩难鸣,故名乱笛。三生石中上石恰生三枝,在石下向上望,中石上一怪客,仿若骷髅(也许便是传说中的精魂吧),仿佛可以洞穿人心。午间山下小寺边食一碗素面,恰过清泉,泉边一寺,寺内“教学楼”见所未见,笑叹“和尚也教学”。大寺庙宇香火不断,千年古刹意蕴犹存,不足方圆的三丈财神庙内求签之人之热切满溢。财神庙外却是那九百五十级让烦人望而却步的长路,浑身腥臭的“懒驴”驮着沙从山底运至山顶。
9 月 21
由于修在学习C++的时候类的设计不可避免,而修在创建了类的时候经常会把复制构造函数和赋值运算符搞混,所以开帖特别记忆一下。
一、定义:
1.赋值构造函数接受其所属类的对象作为参数,来创建一个新的类对象。
2.赋值运算符用于处理同类对象之间的赋值,用”=“表示。
二、使用范围及形式说明:
1.复制构造函数原型如下:
Star(const Star &)
在以下情况下使用复制构造函数:
①将新对象初始化为一个同类的对象
②按值将对象传递给函数
③函数按值返回对象
④编译器产生临时对象
2.赋值运算符(注意与初始化的区别):
Star siriue;
Star alpha = sirus;//初始化
Star dogstar ;
dogstar = sirus;//赋值
赋值运算符用于修改已有对象的值,如果没有动态内存分配可以使用默认的赋值运算符,否则可能需要重载。
由于在类初始化时,编译器会自动为类生成一些成员函数,包括默认的构造函数,复制构造函数和赋值运算符。所以在不需要特殊操作的情况系,无需重新定义。
三、对比
这里用C++perimer plus edition 6书编程练习的一个例子做对比。
复制构造函数:
Cd::Cd(const Cd & d)
{
performers = new char[strlen(d.performers)+1];
label = new char[strlen(d.label)+1];
strcpy(performers,d.performers);
strcpy(label,d.label);
selections = d.selections ;
playtime = d.playtime;
}
赋值运算符:
Cd & Cd::operator=(const Cd & d)
{
//赋值前要删除原来的空间
if(this == &d)
{
return *this ;
}
delete [] performers;
delete [] label ;
performers = new char[strlen(d.performers)+1];
label = new char[strlen(d.label)+1];
strcpy(performers,d.performers);
strcpy(label,d.label);
selections = d.selections ;
playtime = d.playtime;
return *this;
}
程序详见:https://github.com/ghostxiu/CplusplusPrimerPlus6thEditions/tree/master/Chapter13/cd1.cc
四、其他
还要注意赋值运算符和转换函数的区别。
近期评论