1.字符指针
const char* str5 = "abc";
const char* str6 = "abc";
str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态存储区
str5和str6仅是指向该区首地址的指针。
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?true
补充学习:内存区域的分配方式,C++牛客网_59,48,47
2. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?
第一种:
class A{};
class B:public A{};
int main()
{
A* ma = new B();
return 0;
}
类B公有继承A,也可以是间接继承。当把B的对象赋值给A时,会发生隐士转换。
第二种:
class B
{
operator A();
};
B::operator A()
{
}
B实现了隐式转化为A的转化
C++:28---类类型转换之类型转换运算符operator(explicit)
第三种:
class A
{
A(B &a);
};
A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
第四种:
A& A::operator==(B & b)
{
}
class A
{
A&operator==(B & b);
};
赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
3. 以下代码能够编译通过吗,为什么?
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。
4. 以下代码中的输出语句输出0吗,为什么?
struct CLS
{
int m_i;
CLS(int i) : m_i(i) {}
CLS()
{
CLS(0);
}
};
int main()
{
CLS obj;
cout << obj.m_i << endl;
return 0;
}
答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。
输出结果:
9. C++中的空类,默认产生哪些类成员函数?
答:
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};
拓展:牛客网_C++校招面试题16,编写类String的构造函数、析构函数和赋值函数
10. 以下两条输出语句分别输出什么?
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
12. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
答:
void* mymemcpy(void *dest, const void *src, size_t count)
{
char* pdest = static_cast(dest);
const char* psrc = static_cast(src);
if (pdest > psrc && pdest<psrc+count){
for (size_t i = count - 1; i != -1; --i)
pdest[i] = psrc[i];
}
else
{
for (size_t i = 0; i < count;i++)
pdest[i] = psrc[i];
}
return dest;
}
拓展:C++四种类型转换 ,C++牛客网_24题
SQL
https://www.w3school.com.cn/sql/sql_primarykey.asp
创建表格
员工信息表:包含员工ID,员工姓名,电话号码,部门,并将员工ID设置为主键
CREATE TABLE employee(
Id varchar(50) PRIMARY KEY,//主键
name varchar(20) NOT NULL,//姓名
phone varchar(11) NOT NULL,//电话号码
depname varchar(30) NOT NULL//部门名称
)
或者:
CREATE TABLE employee(
Id varchar(50) ,//主键
name varchar(20) NOT NULL,//姓名
phone varchar(11) NOT NULL,//电话号码
depname varchar(30) NOT NULL,//部门名称
PRIMARY KEY (Id)
)
员工打卡记录表:包含员工ID,年,月,日,上班时间,下班时间,(如果上下班都没有记录则员工打开记录中没有该员工当天的数据)
CREATE TABLE workrecord(
employeeId varchar(50),//员工id
nowDate date,//年月日
beginTime time,//上班时间
endTime time,//下班时间
FOREIGN KEY (employeId) REFERENCES employee(Id)
)
在员工信息表中插入数据 员工ID:10001,姓名:张三,电话:13012345678,部门:研发部
INSERT INTO employee(Id,name,phone,depname) VALUES ('10001','张三',‘13012345678’,'研发部')
或者
INSERT INTO employee VALUES ('10001','张三',‘13012345678’,'研发部')
在员工打卡记录表中插入数据 员工ID:10001,年月日取当前时间,上班时间为早上8点,下班时间为空
INSERT INTO workrecord(employeeId,nowDate,begintime,endtime) VALUES('10001',sysdate,8:00,null)
或者
INSERT INTO workrecord VALUES('10001',sysdate,8:00,null)
在员工信息表中增加信息员工性别,默认为男,然后将张三的性别改为女
ALTER TABLE employee ADD sex char(2) default '男'
UPDATE employee SET sex='女' WHERE name='张三'
查找张三本月已迟到早退天数(上班时间晚于8点,下班时间早于5点)
SELECT count(*) FROM workrecord
WHERE employId = (SELECT Id FROM employee WHERE name='张三')
AND DATEDIFF(DAY,nowDate,GETDATE())<=30
AND beginTime>((CONVERT(varchar(12) , getdate(), 111 ))+' 08:00:00')
AND endTime>((CONVERT(varchar(12) , getdate(), 111 ))+' 17:00:00')
列出本月签到次数小于30的员工ID,姓名,部门及签到次数
SELECT employee.Id, employee.name,employee.depname,count(workrecord.employId) as signInTimes
from employee
INNER JOIN workrecord
ON employee.id = workrecord.id
where count(workrecord.employId) > 30
AND DATADIFF(DAY,workrecord.nowData,GETDATA())<=30