c++牛客网做题笔记(一)

一边做题一边思考,才能够提高学习的效率。为了加深记忆,将每天做的题的笔记记录在博客上。

字符数组与字符串

char a[] = {'a','b'};
char b[] = {"ab"};

b数组比a数组多一个‘\0’。b为字符串常量,a为字符数组。c-风格字符串都是以空字符结尾的。
2.
c语言源程序的基本单位是函数
3.
read函数是系统调用而不是c的库函数。fread才是库函数
系统调用是通向操作系统本身的接口,是面向底层硬件的。
库函数(Library function)是把函数放到库里,供别人使用的一种方式。
4.
定义数组时,数组的地址是一个常量。
5.
单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友元函数
不能重载的运算符有: sizeof . * :: ?: typeid 以及4个强制类型转换符
以下一些双目运算符不能被重载为类的友元函数: = () [] ->
6.
复制构造函数与赋值运算符。
复制:用于初始化过程中
赋值:将已有的对象赋值给另外一个对象
7.
c语言本身并没有输入输出语句。输入输出语句都是有函数实现的。c,c++的输入输出都是由三方库或则标准库提供。
8.
全局对象的生命周期在整个程序运行期间,在main函数之前初始化,在main函数返回时撤销。
9.
c语言中的赋值操作符求值顺序是从右到左的
比如 a=x=y+3 其实为a=(x=y+3)
再如a=x+6=y+2 表达式错误。 由于a = (x+6 = y+2)。x+6为一个确定的值,没有地址,不能成为一个左值。左值即是一个地址,右值即是值。
10.
大端:低地址存储在高位
小端:低地址存储在低位
如 unsigned int a = 0x1234. int占4个字节,因补齐没写出来的0.
在大端中表示为:0 0 12 34
在小端中表示为:34 12 0 0
11.
c语言中getchar输入单个字符,
gets输入字符串
scanf适用于格式化输入
12.
函数调用可作为语句或函数表达式或函数参数3种。
当函数调用作为函数参数时候,其实就是回调函数。如qsort函数
13.
递归:
时间复杂度:递归次数
空间复杂度:递归深度
14.
静态方法只能访问静态成员,非静态方法可以访问静态也可以访问非静态,静态方法中不可以定义this,super关键字。主函数是静态的,静态成员已经加载在内存里面。
15.
八进制以0开头。格式化输出字符 %3o 代表以八进制输出,占3个空格位置,右对齐,左边多余的位置补空格。%#o与%#o差别只是输出时必须时输出八进制导0。%08o与%8o差别只是输出时左边多余位置补0.

scanf在输入时候,%d格式遇到非数字字符时候scanf认为输入结束。

int x;
float y;
scanf("%3d%f",&x,&y);
cout<<x<<endl<<y<<endl;

若输入12345M789 则x为123 y=45.000000
若输入12M345789 则x为12 y为垃圾值。
17.

int main()
{
	char dog[] = "wang\0miao";
	char cat[10] = "xiaohua";
	cout<<sizeof(dog)<<strlen(dog)<<endl;
}

输出为10,4.这是由于字符数组自动会在后面补一个\0。strlen遇到\0便结束计算长度。 而cat数组中实际则为:
x i a o h u a \0 \0 \0。
18.
定义二维数组的时候,行可以省,不能省列。

int a[2][] = {{1,2},{3,4}}; //错误
int a[][2] = {{1,2},{3,4}}; //正确

多维数组的声明必须至少指定除第一维以外的所有维的大小
19.
定义宏的时候需要在每个地方都加上括号,要不然的话就要注意题目。
20.

int main()
{
char *p1 = "123";
char *p2 = "abc";
char str[50] = "xyz";
strcpy(str+2,strcat(p1,p2));
str[3] = 'd';
cout << str<<endl;
}

p1 p2指向的是常量区存储区的字符串常量,没法使用strcat,会有问题。
21.
数组定义时,必须指明数组大小,这样编译器可以在内存上申请空间。数组维度是一个常量表达式。

int a[]; //错误
int a[MAX]; //正确

转义字符: \ , \x, \o。 其中\x表示后面跟16进制 \o后面跟八进制
24.
auto根据数据类型分配内存,register在使用时分配cpu寄存器地址。
25.
26.
表建立索引时,update delete insert 需要维护索引
27.
c语言中 函数返回类型若未显示声明,默认int
28.
enum的什么类比struct和class
29.
未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译器会出现不同的结果,什么都有可能发生,这是一个极大的隐患,所以我们应该尽量避免这种情况的发生。
包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, “多
个不确定副作用” 是指在同一个表达式中使用导致同一对象修改两次或修改以后
又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义)

  1. 同一个表达式中有多种运算符

    int i=7;
    printf(“%d”, i++*i++);

  2. 同一语句中各参数的求值顺序

    printf("%d,%d\n",++n,power(2,n));
    3.通过指针修改const常量的值

    int main()
    {
    const int a = 1;
    int b = (int)&a;
    *b = 21;
    printf("%d, %d", a, *b);
    return 0;
    }

使用函数指针时候,一定要注意(*f1)(s)才与f1(s)等效。 *f1(s)与(f1)(s)是不同的
31.
操作符号重载的相关知识点:
不能重载的操作符: 5个 . .
:: sizeof ?:
只能重载为成员函数: = () [] -> new delete
单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友元函数
类型转换函数只能定义为一个类的成员函数
32.
参数多态:函数模板与类模板
包含多态:还有virtual关键字
重载多态:函数重载
强制多态:通过强制类型转换
通用多态是指包含多态和参数多态。
33.
this指针式MyClass *const this指针,this指针指向的对象不可以改变。因此出现this=NULL时,编译不能通过。在析构函数中,如果有delete this语句,会造成堆栈溢出。由于delete this会不断的调用本对象的析构函数,而析构函数又不断调用delete this,形成无限递归,造成了堆栈溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值