【牛客 题库】 求字符串长度和大小 || 基类和派生类的构造函数,隐式调用与显式调用 || 数组下标的数据类型
2017-09-22 11:05
573 查看
1.字符串“a+b=20\n”的长度是()?
解答:A
求字符串长度用的是函数strlen,求字符串大小用的是函数sizeof,具体代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/5eeb93703c3ee8957da25c338466c8a2)
字符'\t','\r','\n'同样是字符,只是它们是不可见字符。所以字符串长度是6个可见字符a,+,b,=,2,0,加上一个不可见字符\n,结果为7个Byte.
计算字符串的大小时,别忘记了,结束符'\0'也占了一个Byte,也就是说,这里的\n后面还有一个隐藏的\n,所以,它的大小为8个Byte.
2.基类和派生类的构造函数,隐式调用与显式调用
2.1 顺序
当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,调用顺序如下:
构造函数:基类->派生类。析构函数:派生类->基类。
这个我们完全可以通过一个小程序来说明:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201709/5eeb93703c3ee8957da25c338466c8a2)
2.2 显示调用和隐示调用
通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式
下面分别给出一个隐式和显式调用的例子:
隐示调用:
显示调用:
3.在C++语言中,引用数组元素时,其数组下标的数据类型允许是 整型常量或整型表达式。说法是否正确?
解答:A
比如
int arr[10]={0}; int i=2,j=3; arr[i]=2; arr[j]=3;
arr[i+j]=9;//这个i+j
就是整形表达式所以是整型变量或整型表达式都行
7
8
5
6
解答:A
求字符串长度用的是函数strlen,求字符串大小用的是函数sizeof,具体代码如下:
int main() { char str[] = "a+b=20\n"; printf("the length of string is %d\n", strlen(str)); printf("the size of string is %d\n", sizeof(str)); return 0; }结果如下:
字符'\t','\r','\n'同样是字符,只是它们是不可见字符。所以字符串长度是6个可见字符a,+,b,=,2,0,加上一个不可见字符\n,结果为7个Byte.
计算字符串的大小时,别忘记了,结束符'\0'也占了一个Byte,也就是说,这里的\n后面还有一个隐藏的\n,所以,它的大小为8个Byte.
2.基类和派生类的构造函数,隐式调用与显式调用
2.1 顺序
当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,调用顺序如下:
构造函数:基类->派生类。析构函数:派生类->基类。
这个我们完全可以通过一个小程序来说明:
//通过输出就可以看出在创建派生类对象b1时各个函数的调用顺序了 #include <iostream> using namespace std; class A { public: A() { cout<<"A(Based Class) constructor is called"<<endl; } ~A() { cout<<"A(Based Class) destructor is called"<<endl; } }; class B:public A { public: B() { cout<<"B(Derived Class) constructor is called"<<endl; } ~B() { cout<<"B(Derived Class) destructor is called"<<endl; } }; int main() { B b1; return 0; }运行结果如下:
2.2 显示调用和隐示调用
通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式
下面分别给出一个隐式和显式调用的例子:
隐示调用:
#include <iostream> using namespace std; class A { public: A(int x = 0,int y = 0) { a = x; b = y; } private: int a; int b; }; //基类A有默认的构造函数,可以隐式调用 class B:public A { public: B(int z = 0) { c = z; } private: int c; }; int main() { B b1; return 0; }
显示调用:
#include <iostream> using namespace std; class A { public: A(int x,int y) { a = x; b = y; } private: int a; int b; }; //基类A没有默认的构造函数,其现有的构造函数需要传递参数,通过 //派生类构造函数调用A构造函数时必须如下显式调用 class B:public A { public: B(int x,int y,int z):A(x,y)//显示调用 { c = z; } private: int c; }; int main() { B b1(1,2,3); return 0; }
3.在C++语言中,引用数组元素时,其数组下标的数据类型允许是 整型常量或整型表达式。说法是否正确?
正确
错误
解答:A
比如
int arr[10]={0}; int i=2,j=3; arr[i]=2; arr[j]=3;
arr[i+j]=9;//这个i+j
就是整形表达式所以是整型变量或整型表达式都行
相关文章推荐
- 【牛客 题库】 指针移动 || 类创建对象的个数|| 求字符串数组中长度最短的字符串所在的行下标
- 基类和派生类的构造函数,隐式调用与显式调用
- 基类和派生类的构造函数,隐式调用与显式调用
- 调用构造函数进行类型转换(显式和隐式)
- Oracle DB 隐式和显式数据类型转换
- 黑马程序员——C复杂数据类型--数组、字符串、指针
- Java基础小知识——基本数据类型和字符串以及字节数组的转换
- 数据类型(基本内置类型)——指针和指针孩子(指针变量(指针类型)、数组(构造类型)、字符串、函数指针、空指针等)
- C++模板类的派生类中访问基类成员必须显式调用(作用域限定)
- 多重继承、虚基类继承时,显式地调用基类构造函数,对象是如何初始化的问题
- Java基础小知识——基本数据类型和字符串以及字节数组的转换
- 关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因
- 关于派生类构造函数与基类构造函数的调用顺序问题
- 牛客 题库 switch()中不允许的数据类型有?
- 多重继承、虚基类继承时,没有显式调用基类构造函数,对象是如何初始化的问题
- C#中派生类调用基类构造函数用法分析
- 关于派生类构造函数与基类构造函数的调用顺序问题
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
- mongodb_数据类型(null/字符串/数字/日期/内嵌文档/数组等)(转并学习)
- C基础语法(二)---复杂数据类型(数组和字符串)