站群系统的优劣,江西萍乡做网站公司,建好网站是不是还得维护,搜索广告优化文章目录 C/C笔试练习1. 初始化列表#xff08;1#xff09;只能在列表初始化的变量 2.构造函数#xff08;2#xff09;函数体赋值#xff08;3#xff09;构造函数的概念#xff08;4#xff09;构造函数调用次数#xff08;5#xff09;构造函数调用次数#xff… 文章目录 C/C笔试练习1. 初始化列表1只能在列表初始化的变量 2.构造函数2函数体赋值3构造函数的概念4构造函数调用次数5构造函数调用次数6构造函数调用次数 3.析构函数7析构函数的概念8析构函数的概念9构造和析构的顺序 4.编程题 day810两种排序方法11求最小公倍数 C/C笔试练习
1. 初始化列表
1只能在列表初始化的变量 有一个类A其数据成员如下
class A {
...
private:int a;
public:const int b;float* c;static const char* d;static double* e;
};则构造函数中成员变量一定要通过初始化列表来初始化的是______。 A. a b c B. b c C. b c d e D. b c d E. b F. c 初始化列表是什么 以一个冒号开始接着是一个以逗号分隔的数据成员列表每个成员变量后面跟一个放在括号中的初始值或表达式。 初始化列表的示例
class Date
{
public:
Date(int year, int month, int day): _year(year), _month(month), _day(day)
{}private:int _year;int _month;int _day;
};初始化列表注意的地方 1每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 2类中包含以下成员必须放在初始化列表位置进行初始化 1.引用成员变量 2.const成员变量 3.自定义类型成员(且该类没有默认构造函数时) 3尽量使用初始化列表初始化 因为不管你是否使用初始化列表对于自定义类型成员变量一定会先使用初始化列表初始化。 4成员变量在类中声明次序就是其在初始化列表中的初始化顺序 与其在初始化列表中的先后次序无关。 只能在初始化列表中初始化的类型示例:
class A
{
public:A(int a):_a(a){}private:int _a;
};class B
{
public:
B(int a, int ref):_aobj(a),_ref(ref),_n(10){}private:A _aobj; // 没有默认构造函数int _ref; // 引用const int _n; // const
}; 根据上面的内容我们知道const修饰的成员变量和引用成员变量只能使用初始化列表来进行初始化a是内置成员可以在初始化列表也可以在函数体内初始化而静态成员变量d,e只能在类外进行定义不能在初始化列表中进行初始化 所以选择b,c。 答案选B 2.构造函数
2函数体赋值 假定一个类的构造函数为A(int aa,int bb){aaa--;ba*bb;}则执行A x(4,5);语句后x.a和x.b的值分别为 A. 20和5 B. 3和15 C. 5和4 D. 4和20 在创建对象时编译器通过调用构造函数给对象中各个成员变量一个合适的初始值
class Date
{
public:
Date(int year, int month, int day)
{_year year;_month month;_day day;
}
private:int _year;int _month;int _day;
};函数体赋值和初始化列表不同 虽然上述构造函数调用之后对象中已经有了一个初始值但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值而不能称作初始化。因为初始化只能初始化一次而构造函数体内可以多次赋值。 在上面的程序中先实例化了A对象x(4,5)将4,5分别赋值给A构造函数中的,aa和bb然后函数体内赋值注意这里先把aa4赋值给a然后才执行后置–此时a4,aa3;然后ba*bb计算得到b20 输出即可。 答案选D 3构造函数的概念 下列关于构造函数的描述正确的是? A. 构造函数可以声明返回类型 B. 构造函数不可以用private修饰 C. 构造函数必须与类名相同 D. 构造函数不能带参数 构造函数的介绍构造函数 构造函数是C中的一个特殊函数用于初始化类对象的数据成员为对象分配内存并完成一些初始化工作。一个类可以有多个构造函数但必须满足函数名相同、参数列表不同的条件称为函数重载。 构造函数有以下特点 1构造函数的函数名与类名相同。 2构造函数无返回值。 3对象实例化时编译器自动调用对应的构造函数。 4构造函数可以重载。 5如果一个类没有定义自己的构造函数编译器会自动生成一个默认的构造函数该函数不带任何参数并且什么也不做它会自动初始化类的成员变量并分配内存。一旦用户显式定义编译器将不再生成 6C把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型如int/char…自定义类型就是我们使用class/struct/union等自己定义的类型编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。 7无参的构造函数和全缺省的构造函数都称为默认构造函数并且默认构造函数只能有一个。注意无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数都可以认为是默认构造函数。 根据上面对构造函数的简单介绍对于a构造函数没有返回值b构造函数可以在实现特殊类的时候就有使用private修饰c构造函数和类名相同构造函数可以重载带参数。 答案选C 4构造函数调用次数 假定有类AB有相应的构造函数定义能正确执行语句请问执行完此语句后共调用该类的构造函数次数为___
AB a(4),b(5),c[3],*p[2]{a,b}A. 5 B. 4 C. 3 D. 9 开始的时候我们实例化了a,b这里会调用两次的单参数构造然后实例化一个数组c,c中有三个元素所以会调用三次默认构造注意这里的p是一个指针数组创建的是指针没有实例化对象。 所以总共调用了2 3 5次构造函数。因此答案为A. 5。 答案选A 5构造函数调用次数 若MyClass是一个类名其有如下语句序列
MyClass c1*c2
MyClass *c3new MyClass
MyClass c4c1上面的语句序列调用构造函数个数是( )。 A. 1 B. 2 C. 3 D. 4 和上面类似实例化c1调用一次构造函数c2是指针不调用构造函数c3指向一个MyClass对象此时再实例化一个Myclass对象调用一次构造函数c4是c1的引用不调用构造函数。 答案选B 6构造函数调用次数 如果MyClass为一个类执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是 A. 2 B. 5 C. 4 D. 9 此时实例化一个数组对象a,数组中有5个MyClass元素所以调用5次构造函数b是一个指针数组内含6个MyClass类型的指针没有实例化对象所以不调用构造函数。 答案选B 3.析构函数
7析构函数的概念 下面对析构函数的正确描述是 A. 系统不能提供默认的析构函数 B. 析构函数必须由用户定义 C. 析构函数没有参数 D. 析构函数可以设置默认参数 析构函数的概念析构函数 与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成对象中资源的清理工作。 析构函数有以下特点 1析构函数名是在类名前加上字符 ~。 2无参数无返回值类型。 3一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。 4析构函数不能重载。 5对象生命周期结束时C编译系统系统自动调用析构函数。 6如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数比如Date类有资源申请时一定要写否则会造成资源泄漏比如Stack类。 所有对于选项A,B当我们没有写析构函数的时候系统会提供一个默认的析构函数析构函数没有参数不能重载所以一个类只能有一个析构函数D错误。 答案选C 8析构函数的概念 哪种说法是错误的? A. 构造函数可以有形参 B. 析构函数可以有形参 C. 构造函数无任何函数类型 D. 析构函数无任何函数类型 构造函数可以有形参实现重载但是一个类只能有一个析构函数所以析构函数没有形参。构造函数和析构函数都没有返回值。 答案选B 9构造和析构的顺序 在 main 函数中变量 a 和 b 的构造函数和析构函数的调用顺序是
class A;
class B;
int main() {A a;B b;return 0;
}A. b构造 - a构造 - a析构 - b析构 B. a构造 - a析构 - b构造 - b析构 C. b构造 - a构造 - b析构 - a析构 D. a构造 - b构造 - b析构 - a析构 我们先实例化A类的对象a此时a会调用构造函数然后类B的对象b会被构造。要注意这里的操作和new和delete的底层相似当main函数结束时对象b会被首先析构然后是对象a。 所以整个生命周期的顺序应该是a构造 - b构造 - b析构 - a析构。 答案选D 4.编程题 day8
10两种排序方法
两种排序方法 解题思路 我们将接受的字符串都放到vector容器中利用string的operator运算符重载来按ascii比较字符串利用string的size来比较字符串的长度。
#includeiostream
#includevector
#includestring
using namespace std;int main()
{int n;cinn;vectorstring v;v.resize(n);for(auto str : v)cinstr;bool lenSym true, lexSym true;// 这里要注意从i1开始遍历前后比较比较长度for(size_t i 1; i v.size(); i){if(v[i-1].size() v[i].size()){lenSym false;break;}}//比较ASCII码for(size_t i 1; i v.size(); i){if(v[i-1] v[i]){lexSym false;break;}}if (lenSym lexSym)coutbothendl;else if (!lenSym lexSym)coutlexicographicallyendl;else if (lenSym !lexSym)coutlengthsendl;else if (!lenSym!lexSym)coutnoneendl;return 0;
}11求最小公倍数
求最小公倍数 解题思路 最小公倍数 两数之积除以最大公约数这里使用碾转相除法进行最大公约数的求解即a与b的最大公约数可以转化为a、b之间的余数为两者之间最小的数之间的公约数。所以对于输入的两个数进行连续求余直到余数为0求余的分母即为结果。
#includeiostream
using namespace std;int gcd(int a, int b)
{int r;while(r a%b){a b;b r;}return b;
}int main()
{int a,b;while(cin a b){cout a*b/gcd(a,b) endl;}return 0;
}