C++牛客网做题笔记(四)

本文探讨了C++中的高级特性与常见误区,包括引用与多态的关系、多线程的安全性考虑、字符串的存储方式、静态成员的正确使用、构造函数与虚函数的注意事项等,帮助开发者深入理解并有效利用这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用与多态之间存在关系。引用是除指针以外另外一个科产生多态效果的手段,一个基类的引用可以指向他的派生类实例。
2.
多线程调用进行保护时,主要是针对全局变量和静态变量,函数内部的局部变量不会受到影响
3.
一个字符串用一个一位数组来存储

int main(int argc, char* argv[]) 
{
char str[2][3] = {"a","b"};  //正确的存储方式
char *str1 = "heloo";
char str[] = "hello";	
}

静态成员不能再类内初始化,除非是const static.类中static成员在类中声明,类外定义。
还有以下3中类型必须通过初始化列表进行初始化
1 非静态常量
2引用类型
3没有默认构造函数的类类型
静态成员,无论是否是常量,都不能在初始化列表中初始化。

	class A
{
public:
	int a1 = 0;   //错误 不能初始化
	const int a2 = 0;
	static const int a3 = 0;
	static int a4 = 0;  //错误
};
int A::a1 = 1;  //错误
const int A::a2 =2; //错误
const int A::a3 = 3;
int A::a4 = 4

++a 与 a++最主要的区别 。是a++是返回一个临时变量,不能赋值。++a返回的是一个左值。

int main(int argc, char* argv[]) 
{
	int a = 5;
	cout <<(++(++a))<<endl;  //正确
	cout <<(++(a++))<<endl; //错误
}

不要在构造函数和析构函数中使用虚函数
7.
c++11中已经可以在类的声明中给数据成员赋初值。
8.
void类型没有分配内存,而引用必须是另一个固定内存变量的别名,所以不能指向void.
9.
malloc函数申请的内存空间不会被初始化,calloc函数会自动初始化内存空间为0,relloc函数不会进行初始化。new运算符对动态分配的内置类型是否初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,函数体内的都不进行初始化。同时new运算符在分配类类型的内存空间时候,调用类的构造函数,对内存空间进行初始化。
10.
关于new和delete与new[]与delete[]其实分为2种情况,
(1)为基本数据类型分配和回收空间
(2)为自定义类型分配和回收空间
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用delete和delete[]都行
对于类对象数组,只能用delete[].
11.
在做类型转换时候,对每个运算先转换后在进行运算

int a = int(2.5 +4.7);  //答案为6  不是7  int a = int(2.5) + int(4.7)

当很频繁的对序列中进行插入和删除操作时,应该选择的容器为list. STL的内容薄弱,需要增强,补强stl源码分析。
13.
构造函数中不要调用虚函数,在基类构造函数中,虚函数为非虚的,不会走到派生类中,采用的静态绑定。 构造函数执行完之后才能够正确初始化虚函数表。
14.
指针是不可以指向任意类型的内存块的,比如一般指针是不能指向const指针。
15.
缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这4中成员函数是特殊的成员函数,这4种函数不能被继承。构造函数式不能被继承的
16
建立类模板对象的实例化过程是模板类到对象
17.

A *pa = new A[10];
delete []pa

上述代码中构造函数和析构函数分别执行了10次
18.
0.0(浮点double)实际上并不是0,而是非常接近于0的小树。

int main(int argc, char* argv[]) 
{
float a =0.0000000000000000000000000000000000000000000000000000000000000000000000001;
if(a == 0.0)
{
	cout<<"正确"<<endl;
}
else
{
	cout << "错误"<<endl;
}
}

此段代码输出为正确。
19.
c++中内存管理的方法有 垃圾回收和引用计数。
20.
c++部分兼容c,不是完全兼容
21

int *p1 = new int[10]; //未初始化
int *p2 = new int[10](); //初始化

空对象指针不能访问数据成员(非静态的),可以访问函数(非虚函数),因为数据成员要分配内存才能访问,而函数式不需要的。
23.
C++不能重载的总共六个:
(1) “.”(类成员访问运算符)
(2)" .*"(类成员指针访问运算符)
(3) “::”(域运算符)
(4)“siezof”(长度运算符)
(5) " ?:"(条件运算符)
还有就是:typeid.
24.
友元的作用是提高程序的运行效率。
25.
在函数调用过程中,如果函数funcA调用了函数funcB,函数funcB调用了函数funcA,则称为函数的间接递归调用。
26.
运算符的优先顺序:
1).聚类运算符 () [] . ->
2) 单目运算符 ! ~ ++ – * (type) sizeof &
3) 算术运算符 + - * / %
4) 移位运算符 >> <<
5) 关系运算符 > < >= <= == !=
6) 逻辑运算符 & ^ | && || ?: (优先级从左到右递减)
7) 赋值运算符 = += -= *= /= …
8) 逗号 ,
27
类模板的成员函数都是函数模板,类模板实例化后,没有使用过的成员函数(即函数模板)不会被实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值