c++ initialization and reference
Initialization
What?: “Provides initial values at the time of construction” - cppreference.com
Direct initialization
#include <iostream>
int main(){
int num1 = 12;
int num2(12.0);
std::cout<<"num1: "<<num1<<" "<<"num2: "<<num2<<std::endl;
return 0;
}
//num1: 12 num2: 12
12.0虽然不是int,但编译仍然会通过
direct initialization 会可能导致narrowing conversion,即窄化转换
这时就需要Uniform initialization
Uniform initialization
// 传统初始化允许窄化转换
int a = 3.14; // 允许,但丢失精度
int b(3.14); // 允许,但丢失精度
// 列表初始化禁止窄化转换
int c{3.14}; // 编译错误!窄化转换
int d = {3.14}; // 编译错误!窄化转换
// 允许的转换
int e{3}; // 允许,3 是整数,没有精度丢失
float f{3.0}; // 允许,3.0 是浮点数,没有精度丢失
Uniform initialization的优势
- 安全,可以避免因为窄化转换带来的各种问题
- 在vector,map等容器中也有许多应用
map
#include <iostream>
#include <map>
int main(){
//uniform initialization of map
std::map<std::string, int>mp = {
{"anon",15},
{"tomorin",16},
{"soyo",15}
};
//Acessing map elements
std::cout<<"tomorin's age: "<<mp["tomorin"]<<std::endl;
std::cout<<"soyo's age: "<<mp["soyo"]<<std::endl;
return 0;
}
tomorin's age: 16
soyo's age: 15
vector
#include <iostream>
#include <vector>
int main(){
//uniform initialization of vector
std::vector<int> nums = {1,2,3,4,5};
//Acessing vector element
for(int num:nums){
std::cout<<num<<" ";
}
return 0;
}
1 2 3 4 5
List Initialization
#include <iostream>
struct student_info{
std::string name;
std::string school;
int id_card;
}
int main(){
//直接赋值
student_info id1;
id1.name = "saki";
id1.school = "yuqiu"
id.id_card = 168;
//list initialization "=" 是可选的
student_info id2 = {"taki", "huaxiaochuan", 114514};
student_info id3 {"rena", "huaxiaochuan", 67908};
std::cout<<id1.name<<" "<<id1.school<<" "<<id1.id_card<<std::endl;
std::cout<<id2.name<<" "<<id2.school<<" "<<id2.id_card<<std::endl;
std::cout<<id3.name<<" "<<id3.school<<" "<<id3.id_card<<std::endl;
}
saki yvqiu 168
taki huaxiaochuan 114514
rena huaxiaochuan 67908
Structured Binding(c++17)
#include <iostream>
#include <tuple>
std::tuple<std::string, std::string, int> getInfo() {
std::string school = "HPU";
std::string association = "HPUSEC";
int classroom_id = 303;
return {school, association, classroom_id};
}
int main(){
auto info = getInfo();
std::cout << "School: " << std::get<0>(info)
<< " Association: " << std::get<1>(info)
<< " Classroom ID: " << std::get<2>(info) << std::endl;
auto [school, association, classroom_id] = getInfo();
std::cout<<"School: "<<school
<< " Association: " << association
<< " Classroom ID: " << classroom_id
<< std::endl;
return 0;
}
School: HPU Association: HPUSEC Classroom ID: 303
School: HPU Association: HPUSEC Classroom ID: 303
- 在已知数据结构的大小时是一种有效的初始化办法
- 能同时访问函数的多个返回值
const and reference
一个典型的reference错误
#include <iostream>
#include <math.h>
#include <vector>
void shift1(std::vector<std::pair<int, int>> &nums) {
for (auto [num1, num2] : nums) {
num1++;
num2++;
}
}
void shift2(std::vector<std::pair<int, int>> &nums) {
for (auto &[num1, num2] : nums) {
num1++;
num2++;
}
}
void shift3(std::vector<std::pair<int, int>> &nums) {
for (size_t i = 0; i < nums.size(); i++) {
nums[i].first++;
nums[i].second++;
}
}
void printNums(std::vector<std::pair<int, int>> &nums){
for(auto[num1,num2]:nums){
std::cout<<num1<<" "<<num2<<std::endl;
}}
int main(){
using it = std::vector<std::pair<int,int>>;
it nums = {{1,2},{3,4}};
shift1(nums);
printNums(nums);
shift2(nums);
printNums(nums);
shift3(nums);
printNums(nums);
}
1 2
3 4
2 3
4 5
3 4
5 6
const
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec{ 1, 2, 3 }; /// a normal vector
const std::vector<int> const_vec{ 1, 2, 3 }; /// a const vector
std::vector<int>& ref_vec{ vec }; /// a reference to 'vec'
const std::vector<int>& const_ref{ vec }; /// a const reference
vec.push_back(3); /// this is ok!
const_vec.push_back(3); /// no, this is const!
ref_vec.push_back(3); /// this is ok, just a reference!
const_ref.push_back(3); /// this is const, compiler error!
return 0;
}
**不能声明对 const 变量的非 const 引用
#include <iostream>
#include <vector>
int main()
{
/// a const vector
const std::vector<int> const_vec{ 1, 2, 3 };
std::vector<int>& bad_ref{ const_vec }; /// BAD
return 0;
}
#include <iostream>
#include <vector>
int main()
{
/// a const vector
const std::vector<int> const_vec{ 1, 2, 3 };
const std::vector<int>& bad_ref{ const_vec }; /// Good!
return 0;
}

浙公网安备 33010602011771号